emm,线性基思想+高斯消元即可解决,其实高斯消元可以替代线性基(bolun).
具体就是把你要异或的数全部进行二进制处理,假如那一位没有主元,且我这个值的最高位为1,因为每次我都会拿最高位消去其他位的1,那么我拿这个值当主元,消掉其他位子的1.emm消元完成后就是查询了,显然这个异或值可以看成一个二进制数,然后按二进制处理即可.注意处理为0的情况,假如出现为0.显然为第1小,我们k--就好,然后就没了hh.虽然我看了两天的线性基.始终没写过线性基的insert.
代码如下:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e5+7;
ll a[N];
int main()
{
    ll t,n;
    cin>>t;
    for(ll y=1;y<=t;y++)
    {
        cin>>n;
        ll cnt=n,sum=0;
        for(ll i=1;i<=n;i++) scanf("%lld",&a[i]);
        for(ll i=1;i<=n;i++)
        {
            for(ll j=i+1;j<=n;j++)
            {
                if(a[i]<a[j]) swap(a[i],a[j]);
            }
            if(a[i]==0) {cnt=i-1,sum=1;break;}
            for(ll j=63;j>=0;j--)
            {
                if(a[i]>>j&1)//这里能消的肯定都被消了.
                {
                    for(int k=1;k<=n;k++)
                    {
                        if(i!=k&&(a[k]>>j&1))
                        {
                            a[k]^=a[i];
                        }
                    }
                    break;
                }
            }
        }
        printf("Case #%lld:\n",y);
        ll Q;
        cin>>Q;
       // cout<<Q<<endl;
        while(Q--)
        {
            ll query;
            cin>>query;
            query-=sum;
            ll ans=0;
            if(1ll<<cnt<=query) puts("-1");
            else
            {
                for(ll i=0;i<cnt;i++)
                {
                    if(query>>i&1)  ans^=a[cnt-i];
                }
                cout<<ans<<endl;
            }
        }
    }
    return 0;
}