最大异或对
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;
}
查看14道真题和解析
华为技术有限公司工作强度 1291人发布
