题目链接:https://vjudge.net/problem/HDU-4825
题解:字典树保存下来,从高位到低位处理
#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
struct node {
int nex[2];
int sum;
}tree[N * 35];
int n, m, a[N];
int tot;
int newnode() {
tot++;
tree[tot].nex[0] = tree[tot].nex[1] = 0;
tree[tot].sum = 0;
return tot;
}
void update(int x, int val) {
int p = 0, op;
for(int i = 30; i >= 0; i--) {
op = ((x >> i) & 1);
if(!tree[p].nex[op])
tree[p].nex[op] = newnode();
p = tree[p].nex[op];
tree[p].sum += val;
}
}
int query(int x) {
int p = 0, op;
int res = 0;
for(int i = 30; i >= 0; i--) {
op = ((x >> i) & 1);
if(tree[tree[p].nex[!op]].sum) {
res += (1 << i);
p = tree[p].nex[!op];
} else {
p = tree[p].nex[op];
}
}
return res;
}
int main() {
int T, nn = 1;
int ans, cnt;
scanf("%d", &T);
while(T--) {
tot = 0;
tree[0].nex[0] = tree[0].nex[1] = 0;
scanf("%d %d", &n, &m);
for(int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
update(a[i], 1);
}
printf("Case #%d:\n", nn++);
while(m--) {
scanf("%d", &cnt);
printf("%d\n", cnt ^ query(cnt));
}
}
return 0;
}