穿越隧道
#include <bits/stdc++.h>
using namespace std;
const int N = 4e6 + 10;
//1e5 * 31 约等于 4e6 (int型数字的二进制位数有31位)
int son[N][2],cnt[N];
int idx;
int a[N];
int n;
void insert(int x){
int p = 0;
for(int i = 30; i >= 0; i--){
int u = x>>i&1;//二进制的第i位是0还是1
if(!son[p][u]) son[p][u] = ++idx;
p = son[p][u];
}
}
int query(int x){
int res = 0, p = 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;//若存在不同的二进制位时,res的1的长度加1
}
else{
p=son[p][u];
res = res*2;//若不存在不同的二进制位时,res的0的长度加1
}
}
return res;
}
int main(){
cin >> n;
for(int i = 0; i < n; i++){//建字典树,相当于已经任选了一个数
cin >> a[i];
insert(a[i]);
}
int ans = -1;
for(int i = 0; i < n; i++){
ans = max(ans,query(a[i]));//进行查询,找之前任选的数(尽可能相反的数)
}
cout << ans << endl;
return 0;
}