2 2 1 2 4 1 2 3 4 3 1 2 3 5 1 2 3 4 5
Case #1: 1 2 3 -1 Case #2: 0 1 2 3 -1HintIf you choose a single number, the result you get is the number you choose. Using long long instead of int because of the result may exceed 2^31-1.
//
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define bignum long long
const int maxn=11000;
//求a中第k小异或值(a[i]可单独取)
bignum a[maxn];
int n;//0->n-1
int l;//线性基个数
//将a[i]写成2进制形式,化简成标准行列式形式(左上角E,右下角0)
void Gauss(const int m=62)
{
l=0;
for(int i=m;i>=0;i--)//位数
{
int flag=0;
for(int j=l;j<n;j++)
{
if(a[j]&(1LL<<i))//1LL important
{
swap(a[l],a[j]);flag=1;break;
}
}
if(flag)
{
for(int j=0;j<n;j++)
{
if(j!=l&&(a[j]&(1LL<<i))) a[j]^=a[l];
}
l++;
}
}
}
bignum calc(bignum k,const int m=62)
{
//0特殊处理
if(l<n)//存在异或值为0
{
if(k==1) return 0;
else k--;
}
if(k>=(1LL<<l)) return -1;
bignum cnt=0;
for(int i=0;i<=m;i++)
{
if(k&(1LL<<i)) cnt^=a[l-i-1];
}
return cnt;
}
int main()
{
int ci,pl=1;scanf("%d",&ci);
while(ci--)
{
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%I64d",&a[i]);
Gauss();
int q;scanf("%d",&q);
printf("Case #%d:\n",pl++);
while(q--)
{
bignum k;scanf("%I64d",&k);
printf("%I64d\n",calc(k));
}
}
return 0;
}