#10050. 「一本通 2.3 例 2」The XOR Largest Pair
大意:给 n 个数,问任取两个数最大的异或和是多少。
思路:二进制字典树,注意要从高位开始建树,不然无法贪心。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5+500;
int tre[maxn*32][2],sz;
int num[maxn*32];
int mp[maxn];
int n,m;
void git(int x){
int now = 0,tem;
for(int i=30;i>=0;--i){
tem = 1&&(x&(1<<i));
if(!tre[now][tem]) tre[now][tem] = ++sz;
now = tre[now][tem];
num[now]++;
}
}
int fid(int x){
int sum = 0,rec = 1<<30,now = 0,tem;
for(int i=30;i>=0;--i){
tem = 1&&(x&(1<<i));
if((tem&&tre[now][0])||(!tem&&!tre[now][1])){
sum += tem*rec;
now = tre[now][0];
}
else{
sum += (1-tem)*rec;
now = tre[now][1];
}
//printf("%d\n",sum);
rec>>=1;
}
return sum;
}
int main(){
scanf("%d",&n);
for(int i=0;i<n;++i){
scanf("%d",&mp[i]);
git(mp[i]);
}
int ans = 0;
for(int i=0;i<n;++i){
int t = fid(mp[i]);
if(t>ans) ans = t;
}
printf("%d\n",ans);
return 0;
}