HDU3949:XOR——题解

http://acm.hdu.edu.cn/showproblem.php?pid=3949

求n个数的异或和第k小。

参考:https://blog.sengxian.com/algorithms/linear-basis

没了。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long ll;
const int BASE=60;
ll b[64];
int n,cnt;
vector<ll>mp;
ll query(ll k){
    if(cnt!=n)k--;
    if(k>(1LL<<(int)mp.size())-1)return -1;
    ll ans=0;
    for(int i=0;i<(int)mp.size();i++){
    if(k>>i&1)ans^=mp[i];
    }
    return ans;
}
inline void init(){
    cnt=0;
    memset(b,0,sizeof(b));
    mp.clear();
}
int main(){
    int t;
    scanf("%d",&t);
    for(int cas=1;cas<=t;cas++){
    printf("Case #%d:\n",cas);
    scanf("%d",&n);
    init();
    for(int i=1;i<=n;i++){
        ll a;scanf("%lld",&a);
        for(int j=BASE;j>=0;j--){
        if(a>>j&1){
            if(b[j])a^=b[j];
            else{
            b[j]=a;cnt++;
            for(int k=j-1;k>=0;k--)
                if(b[k]&&(b[j]>>k&1))b[j]^=b[k];
            for(int k=j+1;k<=BASE;k++)
                if(b[k]>>j&1)b[k]^=b[j];
            break;
            }
        }
        }
    }
    for(int i=0;i<=BASE;i++)
        if(b[i])mp.push_back(b[i]);
    int q;
    scanf("%d",&q);
    while(q--){
        ll k;
        scanf("%lld",&k);
        printf("%lld\n",query(k));
    }
    }
    return 0;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

原文地址:https://www.cnblogs.com/luyouqi233/p/8809826.html

时间: 2024-10-11 09:15:08

HDU3949:XOR——题解的相关文章

【线性基】hdu3949 XOR

给你n个数,问你将它们取任意多个异或起来以后,所能得到的第K小值? 求出线性基来以后,化成简化线性基,然后把K二进制拆分,第i位是1就取上第i小的简化线性基即可.注意:倘若原本的n个数两两线性无关,也即线性基的大小恰好为n时,异或不出零,否则能异或出零,要让K减去1. 这也是线性基的模板. #include<cstdio> #include<cstring> using namespace std; typedef long long ll; ll d[64],p[64]; int

hdu3949 XOR xor高斯消元

XOR Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1364    Accepted Submission(s): 402 Problem Description XOR is a kind of bit operator, we define that as follow: for two binary base number A

[UVA-12716] GCD XOR 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接(vjudge):https://vjudge.net/problem/UVA-12716 题目大意: 输入一个数字t,表示数据组数. 接下来t行,每行给出一个整数n(1<=n<=30000000),问有多少对整数a,b(1<=b<=a<=n),满足gcd(a,b) = a^b. 对于每个n,输出Case x: y,表示当前是第x组数据,结果是y. Sample Input 2 7 20000000

HDU3949 XOR(线性基第k小)

Problem Description XOR is a kind of bit operator, we define that as follow: for two binary base number A and B, let C=A XOR B, then for each bit of C, we can get its value by check the digit of corresponding position in A and B. And for each digit,

[hdu3949]XOR(线性基求xor第k小)

题目大意:求xor所有值的第k小,线性基模板题. #include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<iostream> #include<cmath> using namespace std; typedef long long ll; const int MAX_BASE=63; ll base[64],a[10006]

GCD和XOR题解

由题意 我们要统计1~N中有多少二元组(a,b)满足gcd(a,b) ==a XOR b 首先有如下性质: 1.a XOR b >= a-b  (a >= b) 证明:(给个简单的证明 OI证明都不严谨的) 在二进制下 a XOR b :b某一位的1才对答案有影响,如果a那位为1那就相当于减,为0相当于加 a 减     b: 同样b的某一为的1才对答案影响,且a的那一位不管是0还是1,都是减 所以 a XOR b 一定 >= a-b 2. a - b >= gcd( a,b )

BZOJ2115:[WC2011]Xor——题解

https://www.lydsy.com/JudgeOnline/problem.php?id=2115 https://www.luogu.org/problemnew/show/P4151 这道题当年还是新题,现在都成线性基套路题了. 参考:https://blog.sengxian.com/algorithms/linear-basis 一个1~n路径值可以拆成一条1~n的路径值^几个环(因为去到环和回来的路的值被异或回去了). 于是就变成了处理出所有环的异或值和所有1~n的无环路的异或

HDU3949 XOR

线性基模板 线性基可以看成把一组序列处理过后得到的新数组,他和原序列异或和的值域完全相同,也就是说原序列的任意几个数的异或和都可以被线性基的数表示出来,因此线性基可以看成数原序列的替代. 我们通过特殊的方法处理出线性基,可以快速求出原序列中异或和最大的子集,以及第k小的子集. 存一下自己的板子 #include <bits/stdc++.h> #define INF 0x3f3f3f3f #define full(a, b) memset(a, b, sizeof a) #define FAS

【HDU3949】XOR

[题目大意] 给定一个数组,求这些数组通过异或能得到的数中的第k小是多少. 传送门:http://vjudge.net/problem/HDU-3949 [题解] 首先高斯消元求出线性基,然后将k按照二进制拆分即可. 注意当高斯消元结束后若末尾有0则第1小是0 特判一下然后k--. 然后HDU输出long long是用%I64d 无论C++还是G++都是.(虽然我用了lld也AC了) 1 #include<iostream> 2 #include<cstdio> 3 #includ