从序列A中选出两个进行异或运算,得到的结果最大是多少?
两个数二进制插入Trie
每次遍历时尽量走反
#include<iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N =1e5+4;
int ch[N*32][2],ans;
int tot=1;
void insert(int x){
int u=1;
for(int i=31;i>=0;i--){
int c= (x>>i)&1;
if(ch[u][c]==0){
ch[u][c]=++tot ;
}
u=ch[u][c];
}
}
void find(int x){
int u=1;
int t =0;
for(int i=31;i>=0;i--){
int c= (x>>i)&1;
if(ch[u][c^1]){
u=ch[u][c^1]; t=t*2+1;
}
else{
u=ch[u][c]; t=t*2;
}
}
ans=max(ans,t);
}
int main(){
int tes;
cin>>tes;
while(tes--){
int x; cin>>x;
find(x);
insert(x);
}
cout<<ans;
}
浙公网安备 33010602011771号