题目分析
根据题意我们可以将数字统一看成31位的二进制数据,使用Trie树思想进行求解
在这里,我们对于首先将输入的数据逐个插入构造Trie树
然后依次寻找每个数据与其他数据异或取得的最大值
其中最大的数值便是我们要输出的结果
寻找每个数据与其他数据异或取得的最大值
从数据二进制形式的最高位开始寻找,只要Trie树在这一层存在和该位数据相反的子结点,就转向该结点
//寻找与x与其他数据异或得到的最大值
int find(int x){
int res=0;
int p=0;
for(int i=30;i>=0;i--){
int u=x>>i&1;
if(son[p][!u]!=0){
p=son[p][!u];
res=res*2+1;
}
else {
p=son[p][u];
res=res*2;
}
}
return res;
}
代码实现
#include<bits/stdc++.h>
using namespace std;
//我们把所有数字全部当成31位的二进制数据进行处理
const int N=100010;
const int M=N*31;
int son[M][2];
int A[N];
int idx;
void insert(int x){
int q=0;
for(int i=30;i>=0;i--){
int u=x>>i&1;
if(son[q][u]==0) son[q][u]=++idx;
q=son[q][u];
}
}
//寻找与x与其他数据异或得到的最大值
int find(int x){
int res=0;
int p=0;
for(int i=30;i>=0;i--){
int u=x>>i&1;
if(son[p][!u]!=0){
p=son[p][!u];
res=res*2+1;
}
else {
p=son[p][u];
res=res*2;
}
}
return res;
}
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>A[i];
insert(A[i]);
}
int mmax=0;
for(int i=0;i<n;i++){
mmax=max(mmax,find(A[i]));
}
cout<<mmax<<endl;
return 0;
}