Solution
题目要求一对数使得异或值最大。考虑异或运算的特点:按位进行且不进位。可以想到转化为二进制数进行操作,对每一位分别处理。
把每个整数看做长度为 的
串构建字典树。最低位为字典树的叶子结点。对于数
,在字典树中检索一次,每次都尝试沿着“与
当前位相反的字符”向下访问。若存在这样的字符指针,令答案加上当前位代表的二进制数即可。由于二进制表示下第
位比第
位到第
位之和都大,所以保证了贪心的正确性。
具体实现时,注意数组大小开 的
倍。
Code
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int ans,n,tot=1,trie[N<<5][2];
void Insert(int x){
int y,p=1;
for(int i=31;i>=0;i--){
y=(x>>i)&1;
if(!trie[p][y])
trie[p][y]=++tot;
p=trie[p][y];
}
}
int query(int x){
int y,p=1,res=0;
for(int i=31;i>=0;i--){
y=((x>>i)&1)^1;
if(trie[p][y])
res+=(1<<i),p=trie[p][y];
else
p=trie[p][y^1];
if(!p)
break;
}
return res;
}
int main(){
cin>>n;
int x;
for(int i=1;i<=n;i++){
cin>>x;
ans=max(ans,query(x));
Insert(x);
}
cout<<ans;
return 0;
} 
京公网安备 11010502036488号