链接
大意
给定 个数,从中选出任意两个数,使得它们的异或值最大
思路
异或最大,那么我们尽量使他们每一位都不同,根据这个特性,我们可以将它们拆分成二进制,然后按位查找
例如要找到一个数与1101异或起来最大,那么我们就去找0010,这样子它们的异或值就是最大的
代码
#include<cstdio>
#include<algorithm>
using namespace std;
int trie[8000001][2],tot,n,a,ans;
inline void insert(register int x)//插入
{
int p=0;
for(register int k=31;k>=0;k--)
{
int id=(x>>k)&1;//找到这位是0还是1
if(!trie[p][id]) trie[p][id]=++tot;
p=trie[p][id];
}
return;
}
inline int search(register int x)//尽量查找x的反串
{
int p=0,ans=0;
for(register int k=31;k>=0;k--)
{
int id=(x>>k)&1,o=id^1;
if(trie[p][o]) {p=trie[p][o];ans=ans<<1|1;}
else if(trie[p][id]) {p=trie[p][id];ans<<=1;}
}
return ans;
}
signed main()
{
scanf("%d",&n);
for(register int i=1;i<=n;i++)
{
scanf("%d",&a);
ans=max(ans,search(a));
insert(a);
}
printf("%d",ans);
}