字符串相关
字符串相关
先随便写写,想起来在再补吧。
KMP
这个退役前应该忘不了吧。还是写一下吧。
维护一个 nxt 数组表示最长 border ,匹配的时候直接暴力用 nxt 数组跳到最近的位置。
因为 j 最多往前跳 len 次,算上求 nxt 就是 \(O(n+m)\)。
失配树
kmp 的 nxt 建树罢了,每个位置的 nxt 是它的祖先。
能求两个前缀的最长公共 border ,但是好像没有什么用。
Trie 树
没什么好讲的,0/1 trie 可以讲一下但是并不属于字符串(((
AC 自动机
简单来说就是 trie 树上跑 kmp,但是有点抽象。
我们先来考虑 AC 自动机的建立,每一层都可以用上一层的失配数组更新,因此我们使用 BFS ,将每一层逐层更新,因为在 trie 树上对应的每一个点都是唯一的,因此一定能匹配到最长的,类似于一种 dp 。
自动机科学博大精深,根本妹学懂。
KMP 自动机
就是单串的 AC 自动机,但能匹配到自己儿子。
和 AC 自动机不同的就是 nxt 向上跳的是能匹配到的最长的 border 。
这个东西的优秀之处在于它构造出来之后你往下加一个新的字符它是严格 \(O(len)\) 的,比 kmp 的均摊 \(O(len)\) 要好。
SA
单纯求 SA 的话就是一个倍增加基排的思路,每一次用上一层的两个排名为两个关键字基排,总复杂度 \(O(n\log n)\) ,实现非常巧妙,因此建议直接背板。
主要是这个可以很方便地求 lcp, 几个定理这里就不证明了。
把 height 求出来就可以建 st 求lcp了。
SAM
咕咕咕
扩展 KMP
咕咕咕

浙公网安备 33010602011771号