为什么要学习 AC自动机
当 众多(n 个) "模式串 Ti" 需要确定 与 "母串S" 的相对关系时,
如果 使用 kmp 逐个进行 模式串Ti,与S串(lenS = n)匹配的匹配工作,单次复杂度 = O(n)
n个 Ti,则 复杂度 = O(n * n),此时需要 AC自动机,进行 "一对多" 的快速匹配
复杂度 = O(n +m) m是字符失配跳动的次数(小)
- 相对关系:匹配了哪些 Ti串,匹配多少条 Ti串,匹配Ti 串多少次,等等 可以想到的种种变型算法
算法原理
AC自动机的 "fail指针" 与kmp的 "next数组" 有异曲同工之妙
next数组,是在失配后 直接跳到某个index下,因为kmp只有一条单链的字符串,可以直接用下标表示。
AC自动机,因为是树状结构,只能通过指针 来进行失配后的跳动操作。
- 第一步:建立字典树(随机数据,后边举例会制造特殊数据)
使用 "指针 + 结构体" 的方法,构建字典树
- 第二步:建立 失配指针fail

本文详细介绍了AC自动机的原理和构建过程,包括为何需要AC自动机来解决一对多的模式匹配问题,如何通过建立字典树和失配指针fail来实现高效匹配,以及AC自动机在匹配过程中的操作。通过学习,读者可以掌握AC自动机的实现,并尝试解决相关题目。


2725

被折叠的 条评论
为什么被折叠?



