https://www.luogu.com.cn/problem/P10471
字典树建成之后,用任意一个数去find这个字典树,得出的结果是这个数和建成字典树的那些数字(之中的某一个)异或的可以得到的最大值
当然,求异或最小值也可以
!!!把数放进find求的是数和这个字典树异或的和,要求是和哪一个数异或最大,要
int ans=find(x);
int sum=(ans^x);//要加括号,sum就是x和他异或可以取最值
----------------------------------------------------------------------
#include<cstdio>
using namespace std;
const int N=1e5+10; int a[N],son[N*31][2],idx;
void insert(int x) {//Trie 插入
int p=0;
for(int i=30;i>=0;i--) {
int u=(x>>i)&1;
if(!son[p][u]) son[p][u]=++idx;
p=son[p][u];
}
}
int query(int x) {//如果 x 是其中一个数,求最大异或值。
int p=0,ans=0;
for(int i=30;i>=0;i--) {//从高到低枚举数位,类似插入
int u=(x>>i)&1;
if(son[p][!u]) ans=ans*2+1,p=son[p][!u];//尽量取不一样的数位,这样异或后的结果是 1
else ans*=2,p=son[p][u];
}
return ans;
}
int main() {
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++)
if(query(a[i])>ans) ans=query(a[i]);
printf("%d",ans);
return 0;
}