传送门:loj114
题解
注意构造的线性基 a i a_i ai需要满足:若第 i , j i,j i,j位上都有值,则 a i & 2 j = 0 a_i\&2^j=0 ai&2j=0且 a j & i = 0 a_j\&i=0 aj&i=0,这样从高位到低位贪心才满足只决策了当前位。
需要特判非空子集中是否存在0
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
int n,m,cnt;
ll bin[55],a[N],q,ans;
inline void ins(ll x)
{
int i,j;
for(i=50;(~i)&&x;--i)
if(x&bin[i]){
if(!a[i]){
cnt++;a[i]=x;
for(j=i-1;~j;--j) if(a[i]&bin[j]) a[i]^=a[j];
for(j=i+1;j<=50;++j) if(a[j]&bin[i]) a[j]^=a[i];
break;
}
x^=a[i];
}
}
inline ll sol(ll x)
{
if(x>bin[cnt]) return -1LL;
if(cnt==n) x++;//
ans=0LL;int i,re=cnt-1;
for(i=50;~i;--i) if(a[i]){
if(x>bin[re]){ans^=a[i];x-=bin[re];}
re--;
}
return ans;
}
int main(){
int i,j;ll x;
bin[0]=1LL;for(i=1;i<=51;++i) bin[i]=bin[i-1]<<1;
scanf("%d",&n);
for(i=1;i<=n;++i) {scanf("%lld",&x);ins(x);}
for(scanf("%d",&m);m;--m){
scanf("%lld",&q);
printf("%lld\n",sol(q));
}
return 0;
}