第一次线性基~~~~裸替。。。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
ll base[70];
ll ansbase[70];
ll a[10010];
int kind = 0;
int t, n, q;
const ll l = 1;
ll sh(ll a, int b)
{
for (int i = 1; i <= b; i++)
a /= 2;
return a;
}
void getbase(ll a)
{
bool judge = false;
for (int i = 60; i >= 0; i--)
{
ll temp = a >> i;
if (temp & 1)
{
if (base[i] == 0)
{
base[i] = a;
judge = 1;
break;//易错点!!!!
}
else
a ^= base[i];
}
}
if (!judge)
kind = 1;
}
void clearr()
{
for (int i = 0; i <= 60; i++)
{
if (base[i] == 0)
continue;
for (int k = 60; k >= i + 1; k--)
{
ll temp = base[k]>>i;
if (temp & 1)
{
base[k] ^= base[i];
}
}
}
}
ll getans(ll q, ll stdd, int all)
{
if (q>stdd)
return -1;
if (q == 0)
return 0;
ll temp = 0;
for (int i = 0; i < all; i++)
{
if ((q>>i) & 1)
{
temp ^= ansbase[i];
}
}
return temp;
}
int main()
{
scanf("%d", &t);
// ll aa=1;
//for(int i=1;i<=60;i++)
//aa*=2;
//cout<<aa<<endl;
int k = 1;
while (t--)
{
scanf("%d", &n);
kind = 0;
for (int i = 0; i <= 60; i++)
base[i] = 0;
for (int i = 1; i <= n; i++)
scanf("%I64d", &a[i]), getbase(a[i]);
clearr();
int all = 0;
ll stdd = 1;
for (int i = 0; i <= 60; i++)
if (base[i])
{
ansbase[all++] = base[i];
}
stdd <<= all;
stdd -= 1;
scanf("%d", &q);
printf("Case #%d:\n", k++);
for (int i = 1; i <= q; i++)
{
ll que;
scanf("%I64d", &que);
que -= kind;
printf("%I64d\n", getans(que, stdd, all));
}
}
return 0;
}