当前位置:首页 > 编程笔记 > 正文
已解决

trie 143. 最大异或对

来自网友在路上 168868提问 提问时间:2023-09-28 07:10:05阅读次数: 68

最佳答案 问答题库688位专家为你答疑解惑

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

输入格式

第一行输入一个整数 NN。

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

输出格式

输出一个整数表示答案。

数据范围

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

输入样例:
3
1 2 3
输出样例:
3

代码

#include<iostream>
#include<algorithm>using namespace std;const int N=100010,M=31*N;
int n;
int a[N],son[M][2],idx;void insert(int x)
{int p=0;for(int i=30;i>=0;i--){int &s=son[p][x>>i&1];if(!s)  s=++idx;p=s;}
}int search(int x)
{int p=0,res=0;for(int i=30;i>=0;i--){int s=x>>i&1;if(son[p][!s]){res+=1<<i;p=son[p][!s];}else    p=son[p][s];}return res;
}int main()
{scanf("%d",&n);for(int i=0;i<n;i++){scanf("%d",&a[i]);insert(a[i]);}int res=0;for(int i=0;i<n;i++){res=max(res,search(a[i]));}printf("%d\n",res);return 0;
}

今天下午暗下决心做三个题目,结果发现做这一个题目就已经非常吃力了。这个题目其实暑假的时候就已经看了题解,早几天看了讲解视频,还是有一些一知半解的。

主要的思路是建立一个trie树,然后异或运算是不进位加法,意思就是说,一个数字用二进制方法来表示,如果对应数位上的数字不相同,结果就是1,如果两个数字相同,结果就是0。

我们先把输入的数字使用二进制来进行表示,二进制表示使用算术右移和&运算来进行实现。

x>>i&1

我们知道,数位越高,对数字的影响越大,所以我们从最高位开始考虑问题。

insert函数是用来建立一个trie树的

search函数是用来寻找当前数字的最大的异或数值

假设我们现在数位是1,我们需要的数字就是0,我们选择有0的数字去进行异或运算,如果没有0,我们再去考虑其他情况,有点像是有很多数字可以供选择,我们选择一个满足条件的最优解

res+=1<<i;

这一行是进制的知识,就是把分散的数字归整成为一个十进制数字,可能会成为最后的答案数值 

 

 

 

查看全文

99%的人还看了

猜你感兴趣

版权申明

本文"trie 143. 最大异或对":http://eshow365.cn/6-15082-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!