为什么要学习 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自动机,因为是树状结构,只能通过指针 来进行失配后的跳动操作。
- 第一步:建立字典树(随机数据,后边举例会制造特殊数据)