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; }