题目:
题解:我们先把每一个整数按照从高位到低位,将其每一位放在字典树里,该题的字典树有点特殊,每一个节点上的分叉只有两个,然后我们针对每一个整数,我们从高位到低位进行贪心匹配(由于二进制位权的特点,如果高位匹配成功,就优先选高位,因为如果不选,就算低位全部匹配成功也赶不上高位),不过本题的匹配有点不一样,因为是异或运算,两个位相同为0,不同为1,所以我们就认为当匹配位上的两个值不同我们才能累加其贡献。
#include<bits/stdc++.h>
typedef long long LL;
using namespace std;
const int maxn=1e5+10;
int tree[maxn*31][2],cnt;
int a[maxn];
int n;
void add(int x,int rt)
{
for(int i=30;i>=0;i--){
int y=((x>>i)&1);
if(tree[rt][y]==0){
tree[rt][y]=++cnt;
}
rt=tree[rt][y];
}
}
int query(int x,int rt)
{
int res=0;
for(int i=30;i>=0;i--){
int y=((x>>i)&1);
if(tree[rt][y^1]){
res+=(1<<i);
rt=tree[rt][y^1];
}
else{
rt=tree[rt][y];
}
}
return res;
}
int main()
{
memset(tree,0,sizeof(tree));
scanf("%d",&n);
cnt=0;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
add(a[i],0);
}
int ans=0;
for(int i=1;i<=n;i++){
ans=max(ans,query(a[i],0));
}
printf("%d\n",ans);
return 0;
}