- zbl zbl
- 把线性基中非零元素排出来
- 按照k的二进制分解选择
- 如果线性基外有元素k--
- 正确性显然,类比k的二进制表示
Code
#include<bits/stdc++.h>
#define rep(i,a,b) for(ll i=(a);i<=(b);i++)
#define per(i,a,b) for(ll i=(a);i>=(b);i--)
#define ll long long
using namespace std;
const ll lim=63;
const ll N=1e5;
ll Case=0,tot,k,m,n,T;
ll a[N],b[N],val;
void insert(ll v){
per(i,lim,0)if((v>>i)&1){
if(a[i])v^=a[i];
else{
per(j,i-1,0)if((v>>j)&1)v^=a[j];
rep(j,i+1,lim)if((a[j]>>i)&1)a[j]^=v;
a[i]=v;break;
}
}
}
void work(){
scanf("%lld",&m);
printf("Case #%d:\n",++Case);
while(m--){
ll ans=0;
scanf("%lld",&k);
if(n!=tot)k--;
if(k>=(1<<tot))puts("-1");
else{
rep(i,0,lim)if((k>>i)&1)ans^=a[i];
printf("%lld\n",ans);
}
}
}
int main()
{
scanf("%lld",&T);
while(T--){
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
tot=0;
scanf("%lld",&n);
rep(i,1,n)scanf("%lld",&val),insert(val);
rep(i,0,lim)if(a[i])a[tot++]=a[i];
work();
}
return 0;
}