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;
	}
}

posted @ 2023-03-04 22:35  兑生  阅读(20)  评论(0)    收藏  举报  来源
Live2D