异或
是使用Trie树的思想
1:遍历所有数字,使用所有数字建立一颗trie树
2:再次遍历所有数字,对每一个数字,在对比trie树时,首先找有没有与自己当前值相反的分支,有的话走那一支,否则走另外一支
这便是异或的规则,相同为0,相异为1,所以要走反路
C++ 代码
#include <iostream>
using namespace std;
const int N = 100010, M = 3100010;
int trie[M][2],idx;
int a[N];
void insert(int x){
int ne = 0;
for(int i = 30;i >= 0;--i){
int temp = x >> i & 1;
if(!trie[ne][temp]){
trie[ne][temp] = ++idx;
}
ne = trie[ne][temp];
}
}
int query(int x){
int res = 0;
int ne = 0;
for(int i = 30;i >= 0;--i){
int temp = x >> i & 1;
if(trie[ne][!temp]){
res +=1 << i;
ne = trie[ne][!temp];
}else{
ne = trie[ne][temp];
}
}
return res;
}
int main(){
int n;
cin >> n;
//构建trie树
for(int i = 0;i < n;++i){
cin >> a[i];
insert(a[i]);
}
int res = 0;
for(int i = 0;i < n;++i){
res = max(res,query(a[i]));
}
cout << res << endl;
return 0;
}