【题目描述】
在给定的 N
个整数 A1,A2,…,AN
中选出两个进行异或运算,得到的结果最大是多少?
【输入】
第一行一个整数 N
。
第二行 N
个整数 Ai
。
【输出】
一个整数表示答案。
【输入样例】
5
2 9 5 7 0
【输出样例】
14
【提示】
对于 100% 的数据,1≤N≤105,0≤Ai<231
。
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
const int N=101000,M=31*N;
int son[M][2],a[N];
int idx;
int n,ans=-1;
void insert(int x)
{
int p=0;
for(int i=31;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,res=0;
for(int i=31;i>=0;i--)
{
int u=(x>>i) & 1;
if(son[p][!u])
{
p=son[p][!u];
res=res*2+!u;
}
else
{
p=son[p][u];
res=res*2+u;
}
}
res=res^x;
return res;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
insert(a[i]);
ans=max(ans,query(a[i]));
}
printf("%d",ans);
return 0;
}