把 n 个数的二进制位建立 01 字典树,如下图所示:0、2、7 ,从二进制高位向低位建立二进制字典树。
然后我们 O (n) 枚举每个一个数 x,然后在字典树上匹配找另一个数,从 x 的最高二进制为位开始看,
如果这位是 0,我们则在对应的树中找 1,如果没 1, 我们迫不得已才要走 0。
如果这位是 1,我们则在对应的树中找 0,如果没 0,我们迫不得已才要走 1。
代码
#include<bits/stdc++.h>
using namespace std;#definedbdouble#definelllonglong#definePirpair<int,int>#definefifirst#definesesecond#definepbpush_back#definem_pmake_pair#defineinf0x3f3f3f3f#defineINF0x3f3f3f3f3f3f3f3f/*==========ACMer===========*/constint N =1e5+10;constint M =4e6+10;int a[N];int son[M][2], idx;voidinsert(int x){int u =0;for(int i =30; i >=0; i --){int v =(x >> i)&1;if(son[u][v]==0) son[u][v]=++ idx;
u = son[u][v];}}intquery(int x){int u =0, res =0;for(int i =30; i >=0; i --){int v =(x >> i)&1;if(son[u][! v]){
res +=1<< i;
u = son[u][! v];}else{
u = son[u][v];}}return res;}intmain(){int n;scanf("%d",&n);for(int i =1; i <= n; i ++){scanf("%d",&a[i]);insert(a[i]);}int ans =0;for(int i =1; i <= n; i ++){
ans =max(ans,query(a[i]));}printf("%d\n", ans);return0;}