HDU3949 XOR
【题意】
求异或和第k小的值
【分析】
我们首先需要进行一下对线性基的处理
对于每个p[i],从i+1到max考虑贡献
如果p[j]的第i位为1,那么把p[j]异或上p[i]
接着判断无解的情况
剩下的就是从高位枚举,如果要求的k的二进制第i位为1,那么就把ans异或上p[i]
【代码】
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=10005; int n,q; ll x; ll p[105],ans;int main() { // freopen("a.in","r",stdin); // freopen("a.out","w",stdout); int t; scanf("%d",&t); for(int T=1;T<=t;T++) { printf("Case #%d:\n",T); memset(p,0,sizeof(p)); scanf("%d",&n); int tot=0; for(int i=1;i<=n;i++) { scanf("%lld",&x); for(int j=60;j>=0;j--) { if(!(x&(1LL<<j))) continue; if(p[j]) x^=p[j]; else { p[j]=x; break; } } } for(int i=60;i>=0;i--) for(int j=i+1;j<=60;j++) if((p[j]>>i)&1) p[j]^=p[i]; for(int i=0;i<=60;i++) if(p[i]) p[tot++]=p[i]; scanf("%d",&q); for(int i=1;i<=q;i++) { scanf("%lld",&x); if(n!=tot) --x; if(x>=(1LL<<tot)) { printf("-1\n"); continue; } ans=0; for(int i=tot-1;i>=0;i--) if((x>>i)&1) ans^=p[i]; printf("%lld\n",ans); } } return 0; }