AcWing 4869. 异或值 java Trie字典树
🤠 原题地址


🤠 字典树得开 节点数 * 位数 的大小
🤠 默认 0 节点是根节点
🤠 步步取最优的前提下,碰到怎么走都是最优的情况下 递归 取 min
🤠 参数传递 ,p 当前节点 ,k 当前 位数
import java.io.*;
import java.util.*;
public class Main
{
static int N = 100010;
static int[][] trie = new int[N * 33][2];
static int idx;
static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
static BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
public static void main(String[] args) throws IOException
{
int n = Integer.parseInt(in.readLine());
String[] a = in.readLine().split(" ");
for (int i = 0; i < n; i++)
{
insert(Integer.parseInt(a[i]));
}
System.out.println(query(0, 29));
}
private static void insert(int x)
{
int p = 0;
for (int i = 29; i >= 0; i--)
{
int k = x >> i & 1;
if (trie[p][k] == 0)
{
// 切记 0 是起始节点已经被使用了,所以 idx 得先++
trie[p][k] = ++idx;
}
p = trie[p][k];
}
}
static int query(int p, int k)
{
int ans = 0;
for (int i = k; i >= 0; i--)
{
if (trie[p][0] != 0 && trie[p][1] != 0)
{
ans += 1 << i;
ans += Math.min(query(trie[p][0], i - 1), query(trie[p][1], i - 1));
return ans;
} else if (trie[p][0] == 0)
{
p = trie[p][1];
} else
{
p = trie[p][0];
}
}
return ans;
}
}

浙公网安备 33010602011771号