两数的最大异或值
利用trie树
ans=(ans<<1)|1
ans<<=1
#include<bits/stdc++.h> #define rep(i,x,y) for(register int i=x;i<=y;i++) using namespace std; const int N=400050; int ch[N][32],a[N]; int tot,n; inline void insert(int x){ int u=0; for(int k=30;k>=0;k--){ int c=(x>>k)&1; if(!ch[u][c]) ch[u][c]=++tot; u=ch[u][c]; } } inline int query(int x){ int u=0,v=0,ans=0; for(int k=30;k>=0;k--){ int c=(x>>k)&1,o=c?0:1; if(ch[v][o]) v=ch[v][o],ans=(ans<<1)|1; else v=ch[v][c],ans<<=1; u=ch[u][c]; }return ans; } int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]),insert(a[i]); for(int i=1;i<=n;i++) ans=max(ans,query(a[i])); printf("%d\n",ans);return 0; }