【题目描述】
在给定的 N 个整数 A1,A2,…,AN 中选出两个进行异或运算,得到的结果最大是多少?
【输入】
第一行一个整数 N。
第二行 N 个整数 Ai 。
【输出】
一个整数表示答案。
【输入样例】
5
2 9 5 7 0
【输出样例】
14
【提示】
对于 100% 的数据,1≤N≤105,0≤Ai<2^31 。
#include
using namespace std;
const int N = 5e6 + 10;
int son[N][5];
int n, x, idx, ans;
void add(int x) {
int p = 0;
//从二进制序列第一位开始构建Trie树
for (int i = 31; i >= 0; --i) {
int u = x >> i & 1;//求x的二进制第k位的数
if (son[p][u] == 0)
son[p][u] = ++idx;
p = son[p][u];
}
}
int query(int x) {
int res = 0, p = 0;
for (int i = 31; i >= 0; --i) {
int u = x >> i & 1;
if (son[p][!u]) {
//异或后为1,二进制序列后面加了个1
res = res * 2 + 1;
p = son[p][!u];
} else {
res = res * 2;
p = son[p][u];
}
}
return res;
}
int main() {
cin.tie(0);
cin >> n;
for (int i = 0; i < n; ++i) {
cin >> x;
add(x);
ans = max(ans, query(x));
}
cout << ans;
return 0;
}