解题思路
考虑到异或的性质:两个二进制数出现不同的数位越靠前,异或之后的数就越大。我们考虑用 T r i e Trie Trie数解决这个问题,我们先把n个二进制数看作字符串存入 T r i e Trie Trie树。
考虑选一个数a,在n个数中找到一个b使得两者异或值越大。
考虑从高位到低位判断。
若
a
a
a的第
i
i
i位为
1
,
p
1,p
1,p的
0
0
0指针存在,则沿着
p
p
p的
0
0
0指针走下去,若不存在,则沿着p的1指针往下走。若
a
a
a的第
i
i
i位为
0
0
0则同理。
代码
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int n,a[3200010],trie[3200010][2],tot=1,ans;
void insert(int x){
int p=1,c;
for(int i=31;i>=0;i--){
c=((x>>i)&1);
if(!trie[p][c])
trie[p][c]=++tot;//建树
p=trie[p][c];
}
}
int get(int x)
{
int p=1,c,lyx=0;
for(int i=31;i>=0;i--){
if(((x>>i)&1)==1)
c=0;
else c=1;
if(trie[p][c])//这一位不同
lyx+=(int)(1<<i);//加上贡献
else c=((x>>i)&1);
p=trie[p][c];
}
return lyx;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
insert(a[i]);
}
for(int i=1;i<=n;i++)
ans=max(ans,get(a[i]));
printf("%d",ans);
}