随感录(一) 关于 AC 自动机的两棵树

所以对于怀有梦想,不仅仅局限于“只要进省队就好了”
“只要蹭上 Au 分数线就好了”的同学们来说,
熟练掌握这些东西仅仅只是基础。 by CYjian

JL 的我们都有隐形的翅膀。 by szj

如果题目卡 Trie 图,
而且就是 AC 机的题,
思路使用了奇技淫巧做 fail 树查找,
暴力跳 fail 建树法我们认为他是可以过的。

众所周知,AC 自动机门前有两棵树,一颗叫 trie 树,一颗叫 fail 树。
这两棵树和树的性质就能出许多题目了。

比如阿狸的打字机这道题,我们发现建好 AC 自动机后,
问题转化成多次统计 fail 树的一颗子树内,包含 trie 树上一条链的节点个数,
进而我们选择了采取树状数组 dfn 维护 fail 树子树信息,在 trie 树上进行 dfs 回溯的解法。

再回顾模板题 dfs 优化,
问题是类似的,只不过链是静态的,直接 dfs 求解即可。

喵星球上的点名就很有意思。
这里给出了 \(10^5\) 个 fail 点和 \(0.5\times 10^5\) 条 trie 链。
问题一:求一颗 fail 子树内部所有 trie 链的颜色数。
问题二:求每两条 trie 链集合上方 fail 点的个数。

首先两条 trie 链,有一个合并链的 trick,就是在中间夹上特殊字符,避免跨链匹配。
然后吧,其实我们一般都用 fail 子树 dfn 法,而不是树剖 fail 树,道理懂得都懂。
主要是这个问题是可以转化的。

求颜色数本质上就是去重,
可以通过排序 dfn 后依次加入,并撤销一次 lca 贡献来实现,不需要高级的线段树技巧。
仍然链修单查转单修树查。

对问题二,同样针对会数重的问题,采取撤销 lca 的方法。
然后单点修改树链查询转子树修改单点查询。

暴力建树可以接受,暴力匹配我们就受不了了。
于是需要把所有串都插入 AC 机里面。

注意 trie 链在此处 fail 树中的语境下等价于若干个单点查询/修改。
如果分析不好,不妨认为:
原来的树链变单点。
原来的单点变子树。

posted @ 2026-08-12 13:54  2025ing  阅读(2)  评论(0)    收藏  举报