# 题意
给定n个整数a1,a2,......an,从中选两个进行异或运算,求可以得到的最大值
N∈[1,1e5]
Ai∈[0,231]
# 题解
将每个整数看作32位的二进制01串(数值小在前面补0),把每一个数都插入trie树中,
高位在上,每一步都尝试找与当前不同的字符向下访问,显然高位上尽量为1时最优
节点个数最多有N*31
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=1e5+10; 4 int n,ans; 5 int trie[N*32][2],tot=1; 6 inline void insert(int x){ 7 int p=1; 8 for(int i=30;i>=0;i--){ 9 int u=(x>>i)&1; 10 if(!trie[p][u]) trie[p][u]=++tot; 11 p=trie[p][u]; 12 } 13 } 14 inline int search(int x){ 15 int p=1,res=0; 16 for(int i=30;i>=0;i--){ 17 int u=(x>>i)&1; 18 if(trie[p][!u]){ 19 p=trie[p][!u]; 20 res+=(1<<i); 21 } 22 else 23 p=trie[p][u]; 24 } 25 return res; 26 } 27 int main(){ 28 ios::sync_with_stdio(0); 29 cin.tie(0); 30 cout.tie(0); 31 cin>>n; 32 while(n--){ 33 int x; 34 cin>>x; 35 insert(x); 36 ans=max(ans,search(x)); 37 } 38 cout<<ans<<endl; 39 }
来源:https://www.cnblogs.com/hhyx/p/12556497.html