最大异或对

旧城冷巷雨未停 提交于 2020-03-24 03:44:03

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

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!