求最大异或值可以通过字典树进行求解。
- 首先把每一个数字根据从高位到低位每位是0还是1建字典树。
- 其次把每一个数字按位取反
- 最后把每一个数字按位在字典树中进行查询,如果节点存在,则结果加上这个值,如果节点不存在,则走另一个节点。(因为建树的时候,每个数字都是32位,所以查询的时候,不会存在分支长度小于32的情况)
按位取反1
num=~num;
如果按位遍历数字1
2
3
4for(int i=31;i>=0;i--)
{
int k=(num>>i)&1;
}
定义最小值最大值1
2
描述
给定一些数,求这些数中两个数的异或值最大的那个值
input
第一行为数字个数n,1 <= n <= 10 ^ 5。接下来n行每行一个32位有符号非负整数。
output
任意两数最大异或值
Sample Input
3
3
7
9
Sample Output
14
COJ 1216题
1 |
|