用trie树解决最大异或对问题(On)

在给定的N个整数A1A2ANA1,A2……AN中选出两个进行xor(异或)运算,得到的结果最大是多少?

输入格式

第一行输入一个整数N。

第二行输入N个整数A1A1~ANAN。

输出格式

输出一个整数表示答案。

数据范围

1N1051≤N≤105,
0Ai<2310≤Ai<231

输入样例:

3
1 2 3

输出样例:

3

##########################################################################
 1 #include <iostream>
 2 #include <algorithm>
 3 using namespace std;
 4 
 5 const int N = 1e5+10;
 6 const int M = 300e4+10;
 7 int arr[N];
 8 int son[M][2];
 9 int flag[M], idx;
10 
11 void insert(int x){
12     int k = 30;
13     int p = 0;
14     while(k >= 0){
15         int tmp = x >> k & 1;
16         if(!son[p][tmp]) son[p][tmp] = ++idx;
17         p = son[p][tmp];
18         --k;
19     }
20     flag[p]++;
21 }
22 int main(){
23     int res = 0;
24     int n;
25     cin >> n;
26     for(int i = 0;i < n;++i){
27         cin >> arr[i];
28         insert(arr[i]);
29     }
30     for(int i = 0;i < n;++i){
31         int k = 30;
32         int p = 0;
33         int sum = 0;
34         while(k >= 0){
35             int tmp = arr[i]>>k & 1;
36             if(son[p][!tmp]){
37                  p = son[p][!tmp];
38                  sum += 1 << k;
39             }
40             else p = son[p][tmp];
41             --k;
42         }
43         res = max(res,sum);
44     }
45     cout << res ;
46     return 0;
47 }
View Code

 

end

posted @ 2020-01-21 10:36  SXQ-BLOG  阅读(250)  评论(0)    收藏  举报