思路
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 3e5 + 10;
int tr[maxn * 32][2];
bool full[maxn * 32];
int n, m, cnt;
void add(int x){
int cur = 0;
for(int i = 30; i >= 0; i--){
int f = (x >> i) & 1;
if(!tr[cur][f]) tr[cur][f] = ++cnt;
cur = tr[cur][f];
}
}
void dfs(int u){
bool f = true;
int lson, rson;
lson = tr[u][0]; rson = tr[u][1];
if(!lson && !rson){
full[u] = true;
return ;
}//叶子节点
if(lson){
dfs(lson);
if(!full[lson]) f = false;
}
else f = false;
if(rson){
dfs(rson);
if(!full[rson]) f = false;
}
else f = false;
full[u] = f;
}
int query(int x){
int cur = 0; int ans = 0;
for(int i = 30; i >= 0; i--){
int f = (x >> i) & 1;
if(!tr[cur][f]){
break;
}
if(!full[tr[cur][f]]) cur = tr[cur][f];
else{
f ^= 1;
ans += 1 << i;
//printf("i = %d\n", i);
if(!tr[cur][f]) break;
cur = tr[cur][f];
}
}
return ans;
}
void print(){
for(int i = 0; i <= cnt; i++){
cout << "i = " << i << endl;
cout << "lson = " << tr[i][0] << " rson = " << tr[i][1] << endl;
cout << "full = " << full[i] << endl;
}
}
int main(){
scanf("%d%d", &n, &m);
int x, p;
for(int i = 1; i <= n; i++){
scanf("%d", &x);
add(x);
}
dfs(0);
//print();
x = 0;
for(int i = 1; i <= m; i++){
scanf("%d", &p);
x ^= p;
printf("%d\n", query(x));
}
return 0;
}



京公网安备 11010502036488号