「学习笔记」字符串大礼包

KMP

(f[i])表示(1)(i)最长的后缀等于前缀的长度。容易证得每次(f)最多(+1)且保持非负,然后复杂度就是(O(n))的。匹配当成拼接在原串后面继续计算f数组。

Z-Algorithm or exKMP

(z[i])表示(i)开始的最长的等于原串前缀的长度。暴力扩展是(O(n^2))的,每次记录一个最右的等于某前缀的串([l, r])(i leq r)就从(min(r - i + 1, z[i - l + 1]))开始扩展,否则从(0)开始。能证每次扩展(r)都要向右移动,所以复杂度(O(n))

AC Automaton

构建( ext{fail})的基本思想是对于结点(u)(c)走到达的子节点(v),不断跳(u = ext{fail}[u]),直到存在往(c)走的路,然后( ext{fail}[v] = ext{fail}[ ext{ch}[u][c]])。然而这一过程可以简化,某个点没有往(c)走的边,就连到( ext{fail})(c)走的边。这样补成( ext{trie})图,就能线性时间完成计算。

AC自动机有很多好的性质。比如从(u)(对应串(S))沿着(ch)一直走,每次得到的串(T)(S)后缀和(T)前缀的最大重叠长度是递减的。

原文地址:https://www.cnblogs.com/hongzy/p/11299072.html