题目链接:Codeforces - Vitya and Strange Lesson
逆向思维。显然不可能每次改变数列,我们通过异或的性质,改变一个数字,然后用这个数字查询的时候异或数列即可。
怎么找最小呢?
我们把未出现的数字放到Tire当中,而不是放出现过的。那么找异或min即为答案。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=3e5+10;
int n,m,vis[N<<1],t[N*30][2],s,x,idx;
inline void insert(int x){
int p=0;
for(int i=20;i>=0;i--){
int k=x>>i&1;
if(!t[p][k]) t[p][k]=++idx;
p=t[p][k];
}
}
inline int ask(){
int res=0,p=0;
for(int i=20;i>=0;i--){
int k=s>>i&1;
if(t[p][k]) p=t[p][k];
else res|=(1<<i),p=t[p][k^1];
}
return res;
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++) scanf("%d",&x),vis[x]=1;
for(int i=0;i<=6e5;i++) if(!vis[i]) insert(i);
while(m--){
scanf("%d",&x); s^=x; printf("%d\n",ask());
}
return 0;
}