# 题意
给定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