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

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

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

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

posted @ 2019-08-04 18:06  hfhongzy  阅读(219)  评论(1编辑  收藏  举报