要求个数和
异或后,没有出现的最小数字
那么这个数异或后的值是没有用的,因为都出现过
所以我们把所有不是这个数的数插入字典树
这样这些数异或后一定是没有出现的数字
这样贪心找最小值即可
还有一个小技巧,因为
所以不需要真的改变数组的值,只需要把操作数异或起来就可以
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=6e6+10;
int n,m,zi[maxn][3],id,isok[maxn];
bool ok[maxn];
void insert(int x)
{
int now=0;
for(int i=30;i>=0;i--)
{
int w = ((x>>i)&1);
if( !zi[now][w] ) zi[now][w]=++id;
now = zi[now][w];
}
isok[now]=x;
}
int ask(int x)
{
int ans=0,now=0;
for(int i=30;i>=0;i--)
{
int w = ((x>>i)&1);
if( zi[now][w] ) now = zi[now][w];
else now = zi[now][w^1],ans+=(1<<i);
}
return ans;
}
signed main()
{
cin >> n >> m;
int maxx=0;
for(int i=1;i<=n;i++)
{
int x; scanf("%lld",&x);
ok[x]=1; maxx = max( maxx,x );
}
maxx = (maxx+1)*2;
for(int i=0;i<=maxx;i++)
if( !ok[i] ) insert(i);
int pre=0;
for(int i=1;i<=m;i++)
{
int x; scanf("%lld",&x);
pre^=x;
printf("%lld\n",ask(pre));
}
}
京公网安备 11010502036488号