从序列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; }