题目链接:最大异或对
分析
把每个数转换成二进制然后存入
从高位到低位存 不够31位的补全
题目要求异或后的数尽量大,就是要在查找的时候尽量往不同的数字去找 最后取最大值
上代码
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,ans;
int a[10000001][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 find(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,wx;
cin>>t;
find(t);
in(t);
}
cout<<ans;
return 0;
}