题目大意:给定一个数组,求这些数组通过异或能得到的数中的第k小是多少
首先高斯消元求出线性基,然后将k按照二进制拆分即可
注意当高斯消元结束后若末尾有0则第1小是0 特判一下然后k--
然后HDU输出long long是用%I64d 无论C艹还是G艹都是
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define M 10100
using namespace std;
typedef long long ll;
int n,m,cnt;
bool zero;
ll a[M];
void Gaussian_Elimination()
{
int i,k=0;
ll j;
for(j=1ll<<62;j;j>>=1)
{
for(i=k+1;i<=n;i++)
if(a[i]&j)
break;
if(i==n+1)
continue;
swap(a[i],a[++k]);
for(i=1;i<=n;i++)
if(i!=k)
if(a[i]&j)
a[i]^=a[k];
}
zero=(k!=n);
n=k;
}
ll Query(ll x)
{
int i;
ll re=0;
x-=zero;
if(!x)
return 0;
for(i=n;i;i--)
{
if(x&1)re^=a[i];
x>>=1;
}
if(x)
return -1;
return re;
}
int main()
{
int T,i;
ll x;
for(cin>>T;T;T--)
{
printf("Case #%d:\n",++cnt);
cin>>n;
for(i=1;i<=n;i++)
scanf("%I64d",&a[i]);
Gaussian_Elimination();
cin>>m;
for(i=1;i<=m;i++)
scanf("%I64d",&x),printf("%I64d\n", Query(x) );
}
}