最大异或对
题目链接:最大异或对
题目描述
解题思路
我们可以将每个数拆分成二进制,存入字典树中。
二进制数字越高位换算成十进制数字就越大,所以我们要从高位到低位存数,对于不够 31 31 31 位的数字补全。
题目要求异或后的数尽量大,换句话说就是要在查找的时候尽量往不同的数字去找,最后取 max \max max 值就可以了。
code
#include<iostream>
#include<cstdio>
using namespace std;
int n,ans;
int a[10000000][2],tot=1;
void in(int t)
{
int now=1;
for(int i=31;i>=0;i--)
{
int c=(t>>i)&1;
if(!a[now][c])
a[now][c]=++tot;
now=a[now][c];
}
}
void fd(int t)
{
int now=1,s=0;
for(int i=31;i>=0;i--)
{
int c=!((t>>i)&1);
if(a[now][c])
s+=(1<<i);
else
c=!c;
now=a[now][c];
}
ans=max(ans,s);
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
int t,tt=0;
scanf("%d",&t);
fd(t);
in(t);
}
cout<<ans<<endl;
}