题目
在给定的 N 个整数 A1,A2......AN 中选出两个进行 xor(异或)运算,得到的结果最大是多少?
输入格式
第一行输入一个整数 N
第二行输入 N 个整数 A1~AN
输出格式
输出一个整数表示答案。
数据范围
1≤N≤10^5,
0≤Ai<2^31
输入样例:
3
1 2 3
输出样例:
3
代码
java
import java.util.Scanner;
public class Main {
static int idx, N = 3100010;
static int[][] t = new int[N][2]; // 字典树数组,每个节点有两个子节点
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt(); // 输入数组的长度
int[] a = new int[n + 1];
for (int i = 0; i < n; i++) {
a[i] = in.nextInt(); // 读取数组元素
insert(a[i]); // 将数组元素插入字典树中
}
int res = 0;
for (int i = 0; i < n; i++) {
res = Math.max(res, query(a[i])); // 查询数组元素的最大异或值
}
System.out.println(res);
}
// 查询给定数字 k 的最大异或值
private static int query(int k) {
int p = 0, res = 0;
for (int i = 30; i >= 0; i--) {
int u = k >> i & 1; // 获取数字 k 的第 i 位二进制数
if (t[p][1 - u] != 0) { // 如果当前节点存在与 u 相反的子节点
res += (1 << i); // 更新结果
p = t[p][1 - u]; // 移动到下一个节点
} else {
p = t[p][u]; // 否则移动到同一位的子节点
}
}
return res;
}
// 将数字 k 插入字典树中
private static void insert(int k) {
int p = 0;
for (int i = 30; i >= 0; i--) {
int u = k >> i & 1; // 获取数字 k 的第 i 位二进制数
if (t[p][u] == 0) t[p][u] = ++idx; // 如果当前节点不存在与 k 的第 i 位相同的子节点,则创建一个新的子节点
p = t[p][u]; // 移动到下一个节点
}
}
}