字典树(Trie)学习笔记

简介

字典树,又称Trie,是一种把字符串放在树上的数据结构。

可以用来:

  • 做AC自动机的基础
  • \(O(\min(len_s,len_t))\) 查找一些字符串有多少是另一个字符串的前缀。
  • 处理异或相关问题

做法:

  • 每个点由若干个子节点,对应着下一个字母。
  • 每次从根结点出发,根据当前字母是什么,走向对应的边。
  • 插入时,不断开新的节点。查询时,遇到不存在的节点就返回。

讲的好像不够清楚,上图:
图源csdn

题解

用法1:给定一些字符串s,多次询问另一个字符串t,要求你回答多少s是t的前缀。

做法1:把s放到字典树上,然后让t在字典树上跑。反之亦然。

用法2:给定 \(n\) 个整数,询问两两异或的最大值是多少。

做法2:把前 \(i-1\) 个数字放在字典树上,然后让 \(\neg i\) 在字典树上贪心地查询。

用法3:从很多字符串中查找某些模式串

做法3:把模式串放在Trie上,让查询串在树上跑即可,和用法1几乎一样。(字符串哈希不香吗)

用法4:给定一些整数,求两两异或的lowbit之和。

做法4:把它们放在Trie上,两两 lca++ ,树形dp维护即可。

用法5:给定 \(n\) 个字符串t,\(m\) 个字符串s。对于每个s,分别查询它是否是每个t的前缀,得到一个长为 \(n\) 的bool数组,询问这个数组中最长的连续的 \(0\) 的个数。

做法5:把t放在 Trie 上,在每个节点用set存储有哪些串经过它。之后用s在树上暴力跑即可。

posted @ 2025-02-20 21:22  Luke_li  阅读(21)  评论(0)    收藏  举报