我们回忆一下 KMP 算法的复杂度分析:
表示匹配到模式串哪一位的指针 now 在匹配文本串的每一位的时候至多只会增加 1,不管怎么跳 next 数组,都不会超过增加的次数。所以 KMP 算法在匹配的时候的复杂度为 O(n) 的。
现在考虑 AC 自动机没有修改字典树的结构的做法的复杂度:每次跳 fail 数组都会使当前节点在字典树上的深度变低,而匹配文本串的每一位时,和 KMP 算法一样,都至多只会深度增加 1,不管怎么跳 fail 数组,都不会超过增加的次数。所以 AC 自动机哪怕不修改字典树的结构复杂度仍然为 O(n)?修改字典树的结构仅仅是为了常数?
初学 AC 自动机,求解答。