AC自动机是Trie树与KMP思想的结合。用于多模式串匹配。
和KMP一样,它的原理就是:对所有模式串建一个Trie。任意一个串扔进去,得到的就是在Trie树上最长能匹配的后缀,我们把文本串的每个前缀依次加进去(前缀的后缀就是子串),就能得到模式串与文本串的关系了。
考虑到怎么实现这个功能:和KMP一样,我们需要一个类似 (nxt) 数组的东西,在AC自动机里我们称为 (fail) 指针。Trie中的每个节点通过 (fail) 指针指向它在Trie树里能匹配到的最长后缀。
在一些较为高阶的题目中,我们需要用的 (fail) 树: 每个节点都有唯一的 (fail) 指针,我们把这些指针看做树上儿子到父亲的边,就形成了一棵 (fail) 树。(fail) 树上每个节点都是其子树内节点的后缀,利用这个性质能很好的优化时间复杂度。
- 例题: