#【字典树】The XOR Largest Pair
Description
在给定的 N 个整数 A1, A2,…,AN中选出两个进行xor(异或)运算,得到的结果最大是多少?
Input
第一行一个整数N。
第二行N个整数 Ai。
Output
一个整数表示答案。
Samples
Input 复制
5
2 9 5 7 0
Output
14
Hint
N≤105,0\leq A_i <2^{31}$。
#include <bits/stdc++.h>
using namespace std;
const int N = 4e6 + 10;
int pos = 0, tree[N][2];
int n, ans = -1;
void in(int t) {
int now = 0;
for(int i = 30; i >= 0; --i) {//转换为二进制最多31位
int y = t >> i & 1;
if(!tree[now][y])
tree[now][y] = ++pos;
now = tree[now][y];
}
}
int f(int t) {
int now = 0, ret = 0;
for(int i = 30; i >= 0; --i) {
int y = t >> i & 1;
if(tree[now][!y]) {// 1 or 0 = 1; 寻找与当前数不同的边;
ret += 1 << i;// 1 << i 为二进制第i位的权值
now = tree[now][!y];
}
else {
now = tree[now][y];
}
}
return ret;
}
int main() {
cin >> n;
for(int i = 0; i < n; i++) {
int t;
cin >> t;
in(t);
ans = max(f(t), ans);
}
cout << ans;
return 0;
}