字典树,可以处理类似字典的前缀查询问题,也可以处理最大异或值查询的问题。
题目列表
先贴个可删除的01字典树板子。
HIGH_BIT=19 大概可以处理0-1e6范围的整数
class Node:
__slots__ = 'children', 'cnt'
def __init__(self):
self.children = [None, None]
self.cnt = 0 # 子树大小
class Trie:
HIGH_BIT = 19
def __init__(self):
self.root = Node()
# 添加 val
def insert(self, val: int) -> None:
cur = self.root
for i in range(Trie.HIGH_BIT, -1, -1):
bit = (val >> i) & 1
if cur.children[bit] is None:
cur.children[bit] = Node()
cur = cur.children[bit]
cur.cnt += 1 # 维护子树大小
return cur
# 删除 val,但不删除节点
# 要求 val 必须在 trie 中
def remove(self, val: int) -> None:
cur = self.root
for i in range(Trie.HIGH_BIT, -1, -1):
cur = cur.children[(val >> i) & 1]
cur.cnt -= 1 # 维护子树大小
return cur
# 返回 val 与 trie 中一个元素的最大异或和
# 要求 trie 中至少有一个元素
def max_xor(self, val: int) -> int:
cur = self.root
ans = 0
for i in range(Trie.HIGH_BIT, -1, -1):
bit = (val >> i) & 1
# 如果 cur.children[bit^1].cnt == 0,视作空节点
if cur.children[bit ^ 1] and cur.children[bit ^ 1].cnt:
ans |= 1 << i
bit ^= 1
cur = cur.children[bit]
return ans