原题链接:
题解:
AcWing 143. 最大异或对(好题) - AcWing
字典树不单单可以高效存储和查找字符串集合,还可以存储二进制数字
思路:将每个数以二进制方式存入字典树,找的时候从最高位去找有无该位的异.
Trie树参考模板:常用代码模板2——数据结构 - AcWing
代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int son[N*31][2], idx;//son中一维代表的是树中结点的最大数量,二维代表每个结点的最大孩子结点个数
int a[N];
void insert(int x) {//插入操作
int p = 0;
for (int i = 30;i >= 0;i--) {//高位遍历,如此异或的值才能最大
int u = x >> i & 1;
if (!son[p][u]) son[p][u] = ++idx;
p = son[p][u];
}
}
int query(int x) {//查询操作
int p = 0;
int res = 0;
for (int i = 30;i >= 0;i--) {
int u = x >> i & 1;//通过移位获取最高位
if (son[p][!u]) {
p = son[p][!u];
res = res * 2 + 1;//如果存在相异的,那么这个位的结果就为1
}
else {
p = son[p][u];
res = res * 2 + 0;
}
}
return res;
}
int main() {
int n;cin >> n;
int res = 0;
for (int i = 0;i < n;i++) {
cin >> a[i];
insert(a[i]);
}
for (int i = 0;i < n;i++) {
res = max(res, query(a[i]));
}
cout << res;
}