思路
用一个Tire树来存下N个数的二进制形式的01串,串的长度是31,因为每个数最多为2^31所以,取31,然后根据异或的特性,枚举一下所有的数,取这个数的反码,去树中寻找尽可能和反码向同的路径,并且记录下路径过程的异或值即可
代码
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N=100010;
const int M=N*31;
int son[M][2],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;
if(!son[p][u])son[p][u]=++idx;
p=son[p][u];
}
}
int query(int x){
int p=0;
int res=0;
for(int i=30;i>=0;i--){
int u=x >> i & 1;
res*=2;
if(son[p][!u]){
res+=1;
p=son[p][!u];
}else{
p=son[p][u];
}
}
return res;
}
int main(){
scanf("%d", &n);
for (int i = 0; i < n; i ++ )
{
scanf("%d", &a[i]);
insert(a[i]);
}
int res = 0;
for (int i = 0; i < n; i ++ ) res = max(res, query(a[i]));
printf("%d\n", res);
return 0;
}