【学习笔记】NOIP 字符串
回文与 manacher
P3805 【模板】manacher 算法
-
manacher 模板
P1659 [国家集训队]拉拉队排练
考虑预处理出所有回文半径为 \(i\) 的回文串个数 \(cnt_i\) ,manacher 时进行一个前缀加,差分 + 前缀和处理即可。
- 对于 xxx 前 \(k\) 大的信息进行统计可以开个桶统计每个值的个数。
P3501 [POI2010]ANT-Antisymmetry
回文串计数。
核心思想:
- 匹配规则重定义,定义双射 \(to[x]\) 表示 \(x\) 和 \(to[x]\) 匹配,因为是双射所以需要满足 \(to[to[x]]=x\) 。
UVA11475 Extend to Palindrome
考虑回文串 \(S^*\) 的回文重心 \(pos\) ,其在 \(S\) 中的回文半径一定能将其延伸到 \(S\) 最后一个位置。
那么问题等价于找到回文半径延伸到 \(S\) 最后一个位置最靠前的位置。
manacher 即可。
P5446 [THUPC2018]绿绿和串串
如果只能翻一次那么就是上面那道题的弱化版。
根据上一题的经验,可以在 \(O(n)\) 的时间内预处理出所有翻一次可能的长度。
考虑一个长度 \(m\) 如果长度为 \(m\) 的串可以经过翻若干次使得 \(S\) 是 \(R\) 的前缀,那么以第 \(m\) 位的回文中心的最长回文半径如果伸不到最后一个位置,那么一定要能够伸到第一个位置,并且回文重心对应的右边的位置应该也是一个合法位置。
那么这样我们就可以倒着处理出所有合法的位置从而处理出所有合法的长度。
Border 与 KMP
-
简称 Border 为 Bd。
-
设 \(\text{mxBd(S)}\) 为 \(S\) 的最大 Bd ,\(\text{Bd(S)}\) 为 \(S\) 所有 Bd 构成的集合。
求出某个串的所有 Border
- 定理:\(\text{Bd(S)}=\text{mxBd(S)} \bigcup \text{Bd(mxBd(S))}\)
可以用 kmp 在 \(O(n)\) 的时间内求出字符串 \(S\) 所有前缀的 Border 从后暴力往前跳。
Border 的一些性质
周期:对于字符串 \(S\) 与正整数 \(p\) 若 \(\forall i+p\le |S|\),有 \(S[i]=S[i+p]\) 称 \(p\) 是 \(S\) 的周期。
- 定理:\(S[1,p]\) 是 Border 等价于 \(|S|-p\) 是 \(S\) 的周期。
若 \(p|n\) 称其为整周期
-
定理: \(S[1\sim i]\) 具有长度 \(len<i\) 的整周期的充要条件是 \(len|i\) 且 \(i-len\) 是 \(S[1\sim i]\) 的 border。
-
定理:令 \(p\) 是 \(S\) 的最小整周期,则对于 \(S\) 所有的整周期 \(q\) 一定有 \(p|q\) 。
-
定理:若 \(S\) 是 \(T\) 的前缀,且 \(T\) 有周期 \(a\) , \(S\) 有整周期 \(b\) , \(b|a\),\(|S|\ge a\) ,则 \(T\) 也有周期 \(b\) 。
-
定理:若 \(2|S|\ge |T|\) ,则 \(S\) 在 \(T\) 中匹配的位置必为等差数列。