#LOJ 10050 The XOR Largest Pair
#10050. 「一本通 2.3 例 2」The XOR Largest Pair
又是搋树。
看到这一题,首先想到的 \(\mathcal{O(n^2)}\) 的暴力,一看范围 \(1e5\) 果断放弃。
想想正解怎么做(我也借鉴了别人的思路,毕竟第一次学
根据 \(\oplus\) 的性质,相同为 \(1\),不同为 \(0\),也就是说,把数拆成二进制,越高位不一样 \(\oplus\) 出来的数越大,利用搋树,此时搋树是个二叉树,我们以二进制最高位为根建立搋树,因为这样能把路径上的值按照二进制转十进制的方法求出来,因为高位不一样越大,和线段树进左右子树一样。
/*
Knowledge : Rubbish Algorithm
Work by :Gym_nastics
Time : O(AC)
*/
#include<cmath>
#include<queue>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
const int Mod=1e9+7;
const int N=1e6+6;
int read() {
int x=0,f=0;char ch=getchar();
for(;!isdigit(ch);ch=getchar()) f|=(ch=='-');
for(;isdigit(ch);ch=getchar()) x=(x<<1)+(x<<3)+(ch&15);
return f?-x:x;
}
void print(int x) {
if(x<0) putchar('-'),x=-x;
if(x>9) print(x/10);
putchar(x%10+48);
}
int Trie[N][2],tot;
void Insert(int x){
int pos=0;
for(int i=31;i>=0;i--){
int w=(x>>i)&1;
if(!Trie[pos][w]) Trie[pos][w]=++tot;
pos=Trie[pos][w];
}
}
int Query(int x){
int res=0,pos=0;
for(int i=31;i>=0;i--){
int w=(((x>>i)&1)^1);
if(Trie[pos][w]) res=res<<1|1,pos=Trie[pos][w];
else res<<=1,pos=Trie[pos][w^1];
}return res;
}
signed main() {
int n=read(),Ans=-INF;
for(int i=1;i<=n;i++){
int x=read();Insert(x);
Ans=max(Ans,Query(x));
}print(Ans);
return 0;
}