在给定的 N 个整数 A1,A2,A3...AN 中选出两个进行异或运算,得到的结果最大是多少?
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int n,a[100005];
int c[3100005][2];
int cnt,ans;
inline void cinsert(int x)
{
int pos=0;
for(register int i=32;i>=0;i--)
{
int k=(x>>i)&1;
if(c[pos][k]==-1)
{
cnt++;
c[pos][k]=cnt;
}
pos=c[pos][k];
}
}
inline int query(int x)
{
int pos=0;
for(register int i=32;i>=0;i--)
{
int k=(x>>i)&1;
if(c[pos][1-k]!=-1)
{
ans=ans+(1<<i);
pos=c[pos][1-k];
}
else pos=c[pos][k];
}
return ans;
}
int main()
{
for(register int i=0; i<=3100000;i++)
{
c[i][0]=c[i][1]=-1;
}
cin>>n;
for(register int i=1; i<=n;i++)
{
scanf("%d",&a[i]);
cinsert(a[i]);
}
for(register int i=1; i<=n;i++)
{
ans=max(ans,query(a[i]));
}
cout<<ans;
return 0;
}
MnZn用的把数字的二进制倒着存入trie树,然后贪心选择高位上能为1。
样例
样例输入
5
2 9 5 7 0
样例输出
14
我输出的是50...