最大异或对
The XOR Largest Pair
https://ac.nowcoder.com/acm/contest/1010/B
根据每个数的二进制当成字符串,建字典树,每次查询是,转成二进制的每一位,根据异或的性质,要尽可能的与当前的为不同,异或后为 1 ;
代码:
#include<bits/stdc++.h> using namespace std; const int N=100010,M=31*N; int son[M][2],a[N],idx; void insert(int x){ 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 find(int x){ int p=0; int res=0; for(int i=30;i>=0;i--){ int u=(x>>i)&1;//每次都走跟他相反的 if(son[p][!u]){ res=res*2+1; p=son[p][!u]; } else{ res=res*2+0; p=son[p][u]; } } return res; } int main(){ ios::sync_with_stdio(false); int n; cin>>n; for(int i=0;i<n;i++){ cin>>a[i]; insert(a[i]); } int ans=-1; for(int i=0;i<n;i++){ // cout<<find(a[i])<<" "; // cout<<endl; ans=max(ans,find(a[i])); } cout<<ans<<endl; return 0; }