基础算法 143.最大异或对
此题目使用Trie树,代码中的N代表着节点可能的最大个数。
#include<iostream>
using namespace std;
const int N = 3100010;
int son[N][2], num[100010], idx;
void insert(int k){
scanf("%d", &num[k]);
int i = 30;
int p = 0;
while(i+1){
int u = (num[k] >> i) & 1;
if(!son[p][u])son[p][u] = ++ idx;
p = son[p][u];
i --;
}
}
int find(int n){
int i = 30, p = 0, res = 0;
while(i+1){
int u = (n >> i) & 1;
if(son[p][!u]){
res += 1 << i;
p = son[p][!u];
}
else
p = son[p][u];
i --;
}
return res;
}
int main(){
int n;
scanf("%d",&n);
for(int i = 0; i < n; i ++){
insert(i);
}
int res = 0;
for(int i = 0; i < n; i ++){
res = max(res, find(num[i]));
}
cout << res;
return 0;
}

浙公网安备 33010602011771号