题意:
给你n个数,每次去异或一个数,找出异或后不存在的最小自然数。
POINT:
01字典树处理,具体写在代码里。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <vector>
#include <map>
using namespace std;
#define LL long long
const int maxn = 2000000*3;
int tree[maxn][2];
int val[maxn];
int sz=0;
map<int,int>mp;
void build(int x)
{
int u=0;
for(int i=20;i>=0;i--)
{
int now=(x>>i)&1;
if(tree[u][now]==0)
tree[u][now]=++sz;
u=tree[u][now];
val[u]++;
}
}
int query(int x)
{
int ans=0;
int u=0;
for(int i=20;i>=0;i--)
{
int now=(x>>i)&1;
if(tree[u][now]==0)//如果找不到了,那异或后的答案肯定比现在的ans大。
return ans;
if(val[tree[u][now]]==1<<i)//当前树下面有1<<i个数,即包括了所有可能性,说明ans肯定要+(1<<i)。
{
ans=ans|1<<i;
u=tree[u][now^1];
}
else
u=tree[u][now];
}
return ans;
}
int main()
{
int n,m;
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++)
{
int a;scanf("%d",&a);
if(mp[a]==0)
{
mp[a]=1,build(a);
}
}
int now=0;
for(int i=1;i<=m;i++)
{
int a;scanf("%d",&a);
now=now^a;
printf("%d\n",query(now));
}
}