题意:输入一个数列,输入x,让x和数列每一个数进行异或运算,这个真的难翻译,求mex()
字典树的一种运用,把数列中没有的数,入字典树,如果有和x相同的肯定返回0 了
#include<bits\stdc++.h>
using namespace std;
typedef long long ll;
#define pb push_back
bool vis[600005]={0};
struct node
{
node* go[2];
int in;
node()
{
go[0]=NULL;
go[1]=NULL;
in=0;
}
};
node *root;
void push(int x)
{
node *tmp=root;
for(int i=18;i>=0;i--)
{
int t= ((x >> i) & 1);
if(tmp->go[t]==NULL)
{
node *d=new node();
tmp->go[t]=d;
tmp=d;
}
else tmp=tmp->go[t];
}
tmp->in=x;
}
int query(int x)
{
node*tmp=root;
for(int i=18;i>=0;i--)
{
int t= ((x >> i) & 1);
if(tmp->go[t]==NULL)
tmp=tmp->go[1-t];
else tmp=tmp->go[t];
}
return tmp->in^x;
}
int main(){
int n,m,x;
scanf("%d%d",&n,&m);
root=new node();
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
vis[x]=1;
}
for(int i=0;i<(1<<19);i++)
if(!vis[i])push(i);
int X=0;
for(int i=1;i<=m;i++)
{
scanf("%d",&x);
X^=x;
//cout<<X<<endl;
printf("%d\n",query(X));
}
return 0;
}