题目链接:https://vjudge.net/problem/HDU-5536#author=SCU2018
题意:求max( (a[i] + a[j]) xor a[k] ) (i, j, k互不相同)
题解:因为n只有1000,所以可以枚举 i j,然后其他数建字典树,对应直接查询即可
#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
struct node {
int nex[2];
int sum;
}tree[N * 35];
int n, 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;
int ans, cnt;
scanf("%d", &T);
while(T--) {
tot = 0;
tree[0].nex[0] = tree[0].nex[1] = 0;
scanf("%d", &n);
for(int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
update(a[i], 1);
}
ans = 0;
for(int i = 1; i < n; i++) {
update(a[i], -1);
for(int j = i + 1; j <= n; j++) {
cnt = a[i] + a[j];
update(a[j], -1);
ans = max(ans, query(cnt));
update(a[j], 1);
}
update(a[i], 1);
}
printf("%d\n", ans);
}
return 0;
}