详见代码注释
C++ 代码
#include <iostream>
#include <algorithm>
#include <climits>
using namespace std;
#define NMAX 32000005
int tire[NMAX][2];
int tot;
int nums[1000005];
//以从大到小的顺序作为一个串记录,因为如果反过来,会有xor时不知道何时应该中止的事情发生。
void addValue(int val){
int dig = 0;
int p = 0;
for( int i=30;i>=0;i--){
int x = (val & (1<<i))> 0 ? 1 : 0;
if(tire[p][x] == 0 ) tire[p][x] = ++tot;
p = tire[p][x];
}
}
int xorMax(int val){
int p = 0;
int ret = 0;
for( int i=30;i>=0;i--){
int x = (val & (1<<i))> 0 ? 0 : 1;
if(tire[p][x]){
p = tire[p][x];
ret |= 1 << i;//因为找到了相反的数字,所以异或的结果就是这位赋1
}else{
p = tire[p][1-x];
}
}
return ret;
}
int main(){
int n;
scanf("%d",&n);
int val;
for(int i=0;i<n;++i){
scanf("%d",&nums[i]);
addValue(nums[i]);
}
int ret = INT_MIN;
for(int i=0;i<n;++i){
ret = max(ret,xorMax(nums[i]));
}
printf("%d\n",ret);
return 0;
}