The Xor Largest Pair(Trie)

传送门

唔~~~~首先,必须先知道这得用Trie做

Xor不是相同的为0,不同的为1吗?此时我要求出答案最大,那么就是要在保证数位最大的情况下使选出的两个数不同位最多喽~~~

可以弄一个get函数用来查询,只需每次查询时将每一位变一下就可以啦

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<algorithm>
 6 #include<cstdlib>
 7 using namespace std;
 8 int ch[400005<<5][2],tot=0,n,a[400005];
 9 void insert(int x)
10 {
11     int p=0;
12     for(int i=31; i>=0; i--){
13         int c=(x>>i)&1;
14         if (!ch[p][c]) ch[p][c]=++tot;
15         p=ch[p][c];
16     }
17 }
18 int get(int x)
19 {
20     int p=0,v=0,ans=0;
21     for(int i=31; i>=0; i--){
22         int c=(x>>i)&1; 
23         int o; if (c) o=0; else o=1;
24         if (ch[v][o]) v=ch[v][o],ans=(ans<<1)|1;
25             else v=ch[v][c],ans<<=1;
26         p=ch[p][c];
27     }
28     return ans;
29 }
30 int main()
31 {
32     scanf("%d",&n); int ans=0;
33     for(int i=1; i<=n; i++) scanf("%d",&a[i]),insert(a[i]);
34     for(int i=1; i<=n; i++) ans=max(ans,get(a[i]));
35     printf("%d\n",ans);
36     return 0;
37 }

miao~~~

posted @ 2018-08-01 15:13  wangyh1008  阅读(165)  评论(1编辑  收藏  举报