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;
}
京公网安备 11010502036488号