传送门:http://acm.hdu.edu.cn/showproblem.php?pid=3949
一个讲的比较好的博客:http://m.blog.csdn.net/blog/wdcjdtc/38300217
Orz hzwer:http://hzwer.com/5491.html
思路:为什么我搜线性基什么也没搜到呢..
用高斯消元维护线性基,然后....就是代码了
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
const int maxn=10010;
using namespace std;
typedef long long ll;
int T,n,m,tot;ll a[maxn],bin[65],x;char ch;bool zero;
void read(ll &x){
for (ch=getchar();!isdigit(ch);ch=getchar());
for (x=0;isdigit(ch);ch=getchar()) x=x*10+ch-'0';
}
void gauss(){
tot=zero=0;
for (int i=60;i>=0;i--){
int j=tot+1;
for (;!(bin[i]&a[j])&&j<=n;j++);
if (j>n) continue;
swap(a[++tot],a[j]);
for (int j=1;j<=n;j++)
if (j!=tot&&(a[j]&bin[i]))
a[j]^=a[tot];
}
if (tot!=n) zero=1;
}
ll query(ll x){
ll res=0;x-=zero;
if (!x) return 0;
if (x>=bin[tot]) return -1;
for (int i=1;i<=tot;i++)
if (x&bin[tot-i]) res^=a[i];
return res;
}
int main(){
bin[0]=1;for (int i=1;i<=62;i++) bin[i]=bin[i-1]<<1;
scanf("%d",&T);
for (int i=1;i<=T;i++){
printf("Case #%d:
",i);
memset(a,0,sizeof(a)),scanf("%d",&n);
for (int j=1;j<=n;j++) read(a[j]);
gauss(),scanf("%d",&m);
for (int j=1;j<=m;j++)
read(x),printf("%lld
",query(x));
}
return 0;
}