题:
在给定的 N 个整数 A1,A2……AN 中选出两个进行 xor(异或)运算,得到的结果最大是多少?
输入格式
第一行输入一个整数 N。
第二行输入 N 个整数 A1~AN。
输出格式
输出一个整数表示答案。
数据范围
1≤N≤105,
0≤Ai<231
输入:
3
1 2 3
输出:
3
概念:求异或值时先将其转化为二进制,进行异或运算(同为0 不同为1),然后再转换为十进制的值。
首先,暴力做法:
int res = 0; //定义异或最小值,最小即为0
for (int i = 0; i < n; i++) {
//枚举第一个数
for (int j = 0; j < i; j++) {
//枚举第二个数
res = max(res, a[i] ^ a[j]);
}
}
思路:在进行异或的判断时,从左往右,当左边的异或为1,即不相等时,异或后得到的值一定较大,根据这个可将处所比较数外的剩下的数分为第一位相同和第二位不同两类。
算法原理:将数对应的二进制按Trie树输入,两个数进行比较时,挑选不同的一边往下进行,此时所异或的值是最大的,若往下只有一条则往该条路进行(尽量往不同的位走)
(在画Trie树时可默认为往右为1,往左为0)
代码:
//有注释版
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 100010,M = 31 * N;
int n;
int a[N];
int son[M][2], idx; //每个根节点对应的子节点最多有2个
void insert(int x) {
int p = 0