Cage 字符串听课笔记
困困困!
KMP
注意到 KMP 的复杂度是均摊的,那么是否可以绕开?
注意到 KMP 实际上一个串的 ACAM,那么考虑可以类似的,在加入一个字符的同时维护 ACAM(考虑 ACAM 的构建过程,前面的点不会被影响)那么每次就可以通过 \(O(|\Sigma|)\) 的修改(或者利用可持久化数据结构达到 \(O(\log |\Sigma|)\))
但是似乎还有不依赖字符集以及数据结构的做法。先导入一些定义,定理。
- border: 若 \(k\) 满足 \(S_{1 \ldots k} = S_{n - k + 1 \ldots n}\) 那么 \(S_{1 \ldots k}\) 是 \(S\) 的 border。
- period: 若 \(\forall k \in [1, n - k] s.t. S_i = S_{i + k}\),那么 \(k\) 是一个周期。
如果存在长度为 \(k\) 的 border,那么存在长度为 \(n - k\) 的 period
Weak Period Theory
若 \(p, q\) 均为周期,那么 \(\gcd(p, q)\) 也为周期!
border 的 \(O(\log n)\) 等差数列
话是说如果将一个串的所有 border/period 排序,那么可以划分为 \(O(\log n)\) 个等差数列。
如何证明,考虑最长的 border,以及其对应的最小的周期。如果这个 border 长度 \(\ge \frac n2\),那么不断的减去这个周期就可以构造出新的 border。由于这个周期是最小的,所以中间不会有更多的 border 存在。
但是当这个串减到 \(\le \frac n2\) 那么此时可能存在新的 border 并不是由最大的那个减过来的。但是此时可以进入子问题,问题减半。
于是 border 可以划分为 \(O(\log n)\) 个等差数列。