经典字典树求异或最大值
来源:互联网 发布:备案域名转让 编辑:程序博客网 时间:2024/05/18 18:16
给出n个数,求在这n个数中取两个数使得他们异或最大
解题思路
非常经典利用字典树求异或的最大值。
读懂这个题目之后,对于初学者我们可能会思考下面的问题:
1. 两层循环o(n^2)肯定能求出了,但是肯定会超时
2. 这道题怎么做呢?
3. 思考一阵(在不知道用什么算法的情况下),会不会用把每个数转换为二进制,然后按位进行比对
4. 就算转换为二进制之后,怎么进行按个比对呢?
上面的几个问题就是我,看到这个题目的时候思考的几个问题,我们知道字典是拥有公共前缀的,对应于一个十进制数的二进制来讲,每个二进制数能转换到字典树里面。
因为题目中对数据的要求不超过10^9那么转换为二进制也就是不会超过2^32这个数,那么我们对每一个数的保存时通过把这个数变为32位数比如1保存的就是0(31)1。建立之后我们在通过一次循环找这个数的二进制的一根分支上有多少不同的,然后取最大的。不理解没有关系,我们用题目中的第一个样例来举例:
样例是
4
1 2 3 4
那么我们先要把1这个转换为字典中的节点,一位要转换为32位的,所以前面的三十位都应该是0,最后一位是1那么转换为图就是下面这个图:
,然后我们就要在这个字典树中建立第二个节点也就是2,2对应的32位二进制位0(30)10,对应如下图
,
一次的建立第三个节点和第四个节点,第三个节点如下:
第四个节点:
,
把整个字典树完全做好之后就变为下面的图:
,
由图我们可以知道这棵树一共有有32层,每一个节点最多拥有两个节点分别是0和1。那么我们怎么用代码把这个字典树建立起来呢?
因为一个节点最多有两个节点,所以我们就用一个二维数组son[MAXN][2]
来保存每个节点的值,son[i][alp]
这个数组的意义表示编号为i的节点里面保存的是alp(0或者1)是孩子节点(存就保存的是下一个节点的编号)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
这样一颗完美的字典树就建立好了!,那么怎么查询出异或的最大值呢?
查询的话就相对来说比较简单了!
循环输入的n个数,每次找他的反方向,比如最开始的1,0(31)1这个32位二进制数我们按照常理来说应该是先找1因为1和0(31)1的第一位是不同的,但是这个节点不存在就没有办法访问到,我们只能在存在的分支上找和输出的数不同的数,我们还是按照第一个输入的这个十进制1来说明,看下图:
对应的查询代码如下:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
AC代码
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
如果不理解的话,可以把我注释的程序代码,取消注释就能直观的反映变化
- 经典字典树求异或最大值
- Find MaxXorSum 经典字典树求异或最大值
- poj 3764 字典树求异或最大值
- HDU6059(01字典树求异或最大值)
- Codeforces 706D Vasiliy's Multiset (字典树求异或最大值)
- HDU 4825 Xor Sum (字典树求异或最大值)
- 异或最大值(01字典树)
- CSU 1216 异或最大值【字典树】
- HDU5390 tree dfs序+线段树分层离线+字典树求异或最大值
- CSU-1216: 异或最大值-trie-01字典树
- CSU 1216: 异或最大值(字典树+贪心)
- poj 3764 字典树 树上任意两点边权异或最大值
- hdu4825 Xor Sum 字典树与异或(经典)
- 字典树+数组的前后部分数异或的最大值
- 01字典树专题 (解决异或最大值问题)不断更新ing~
- 【求两个数异或的最大值】01字典树求解
- Codeforces Round #430-01字典树&类异或最大值-D. Vitya and Strange Lesson
- 获取最大值(经典!)
- Windows下安装Redis以及可视化工具
- 【hdu 1235】统计同成绩学生人数
- Oracle数据迁移至HBase操作记录
- 确定比赛名次
- Color the ball
- 经典字典树求异或最大值
- spring boot成功启动后访问报错404的问题
- php变量类型转换的原理
- 纯css制作 虾
- 欧拉路·一
- 使用简单的URDF模型文件结合ros小车实现同步运动
- HNUST 1522: 爱心苹果
- An introduction to the /etc/init.d directory
- 从零开始开发一款Android App