本文翻译自这篇论文
译者水平有限,如有错漏,还望指出
论文中有伪代码可以帮助理解
众所周知,字符串的border有和等差数列相关的一些性质(border group),可以参考2015年集训队论文集里的《浅谈字符串匹配的几种方法》一文,回文串的回文border也有类似的性质。
tips:
真后缀定义类似真子集
下面给出算法所用到的几个引理
引理1
令y为回文串x的后缀,y是x的border当且仅当y是回文串
证明显然
引理2
令y为x的后缀且
|x|≤|2y|
|
x
|
≤
|
2
y
|
,x是回文串当且仅当y是回文串
证明显然
引理3
令y为x的真后缀,
|x|−|y|
|
x
|
−
|
y
|
是x的循环节当且仅当y是回文串
显然
引理4
令y为回文串x的最长回文真后缀,z为y的最长回文真后缀,不妨令 x=uy,y=vz x = u y , y = v z ,那么有
(1)|u|≥|v| ( 1 ) | u | ≥ | v |
(2)if|u|>|v|,|u|>|z| ( 2 ) i f | u | > | v | , | u | > | z |
(3)if|u|=|v|,u=v ( 3 ) i f | u | = | v | , u = v
由前三个引理可证
有了上述4个引理,我们可以类似border group搞事情
对于一个前缀 S1,j S 1 , j ,定义 Pj P j 为下标集合 {p1,p2...pm},p1<p2<...<pm { p 1 , p 2 . . . p m } , p 1 < p 2 < . . . < p m 表示 S1,j S 1 , j 的所有回文后缀的开头,定义差值为 pi+1−pi p i + 1 − p i ,那么有
引理5
Pj P j 的差值单调不增,且最多有 O(logj) O ( log j ) 种取值
由引理4显然
对每个不同的差值 Δ Δ ,定义 Pj,Δ={pi:1<i≤m,pi−pi−1=Δ} P j , Δ = { p i : 1 < i ≤ m , p i − p i − 1 = Δ } , 特殊的, Pj,∞={p1} P j , ∞ = { p 1 } ,每一个 Pj,Δ P j , Δ 可以表示为三元组 (minPj,Δ,Δ,|Pj,Δ) ( min P j , Δ , Δ , | P j , Δ ) ,将三元组按 Δ Δ 降序记在链表 Gj G j 中
那么由引理5, Gj G j 的大小是 O(logj) O ( log j ) 的,接下来证明 Gj G j 能用 O(|Gj−1|) O ( | G j − 1 | ) 时间从 Gj−1 G j − 1 推过来。众所周知,每个 i∈Pj−1 i ∈ P j − 1 要么被 i−1∈Pj i − 1 ∈ P j 替代要么被删除,那么有
引理6
令 pi p i 和 pi+1 p i + 1 为 Pj−1,Δ P j − 1 , Δ 中的相邻元素, pi−1∈Pj p i − 1 ∈ P j 当且仅当 pi+1−1∈Pj p i + 1 − 1 ∈ P j
易证
有了引理6,可以想象,三元组
(i,Δ,k)∈Gj−1
(
i
,
Δ
,
k
)
∈
G
j
−
1
或被删除或被替换为
(i−1,Δ,k)
(
i
−
1
,
Δ
,
k
)
,也即
但是,我们的新三元组似乎有些不合定义,需要做一些调整:若 pi∈Pj−1,Δ p i ∈ P j − 1 , Δ 被 pi−1 p i − 1 替换,而 pi−1=pi−Δ∈Pj−1 p i − 1 = p i − Δ ∈ P j − 1 被删除,那么 pi−1 p i − 1 就不应该在 Pj,Δ P j , Δ 里。注意到只有每组第一个元素可能需要调整,故我们分裂出每组第一个元素,即
其中 Δ′ Δ ′ 为 pi−1 p i − 1 在 Pj P j 中新的差值
令 G′′j G j ″ 为 G′j G j ′ 经过上述变换的结果,可以看出差值的维护已经基本无误了,接下来只需要合并差值相等的三元组,就可以通过 G′′j G j ″ 得到正确的 Gj G j 了
引理7
Gj G j 可由 Gj−1 G j − 1 用 O(|Gj−1|)=O(|logj|) O ( | G j − 1 | ) = O ( | log j | ) 时间计算出
上述7个引理足够维护 Gj G j ,接下来解释如何通过 Pj,Δ P j , Δ 和 Pj−Δ,Δ P j − Δ , Δ 的联系快速转移DP值
引理8
若有 (i,Δ,k)∈Gj,k≥2 ( i , Δ , k ) ∈ G j , k ≥ 2 ,则有 (i,Δ,k−1)∈Gj−Δ ( i , Δ , k − 1 ) ∈ G j − Δ
画图可证
由引理8,若 |Pj,Δ≥2| | P j , Δ ≥ 2 | 则 Pj,Δ=Pj−Δ,Δ∪{maxPj,Δ} P j , Δ = P j − Δ , Δ ∪ { max P j , Δ } ,凭此即可在常数时间利用 PLj−Δ,Δ P L j − Δ , Δ 计算 PLj,Δ=min{PLi−1+1:i∈Pj,Δ} P L j , Δ = min { P L i − 1 + 1 : i ∈ P j , Δ } 。 PLi P L i 表示第 i i 个前缀的最小回文分解大小。我们把存在 GPLm,m=minPj,Δ−Δ G P L m , m = min P j , Δ − Δ 中,显然当 |Pj,Δ|≥2 | P j , Δ | ≥ 2 的时候 PLj,Δ P L j , Δ 和 PLj−Δ,Δ P L j − Δ , Δ 对应下标相同,接下来证明一个引理,来说明在 j−Δ j − Δ 到 j j 中不会有其他时刻访问此位置
引理9
令, ∀l∈[j−Δ+1,j−1],m∉Pl ∀ l ∈ [ j − Δ + 1 , j − 1 ] , m ∉ P l
易证
综上,我们有
定理10
最小回文分解可以用 O(nlogn) O ( n log n ) 时间 O(n) O ( n ) 空间计算
没懂可以看论文里的伪代码
后面的东西暂时不感兴趣,不翻了
例题: