最小回文分解NlogN算法

本文翻译自这篇论文
译者水平有限,如有错漏,还望指出
论文中有伪代码可以帮助理解
众所周知,字符串的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+1pi p i + 1 − p i ,那么有

引理5

Pj P j 的差值单调不增,且最多有 O(logj) O ( log ⁡ j ) 种取值

由引理4显然

对每个不同的差值 Δ Δ ,定义 Pj,Δ={pi:1<im,pipi1=Δ} 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(|Gj1|) O ( | G j − 1 | ) 时间从 Gj1 G j − 1 推过来。众所周知,每个 iPj1 i ∈ P j − 1 要么被 i1Pj i − 1 ∈ P j 替代要么被删除,那么有

引理6

pi p i pi+1 p i + 1 Pj1,Δ P j − 1 , Δ 中的相邻元素, pi1Pj p i − 1 ∈ P j 当且仅当 pi+11Pj p i + 1 − 1 ∈ P j

易证

有了引理6,可以想象,三元组 (i,Δ,k)Gj1 ( i , Δ , k ) ∈ G j − 1 或被删除或被替换为 (i1,Δ,k) ( i − 1 , Δ , k ) ,也即

Gj={(i1,Δ,k):(i,Δ,k)Gj1,i>1,and Si1=Sj} G j ′ = { ( i − 1 , Δ , k ) : ( i , Δ , k ) ∈ G j − 1 , i > 1 , and  S i − 1 = S j }

但是,我们的新三元组似乎有些不合定义,需要做一些调整:若 piPj1,Δ p i ∈ P j − 1 , Δ pi1 p i − 1 替换,而 pi1=piΔPj1 p i − 1 = p i − Δ ∈ P j − 1 被删除,那么 pi1 p i − 1 就不应该在 Pj,Δ P j , Δ 里。注意到只有每组第一个元素可能需要调整,故我们分裂出每组第一个元素,即

replace (pi1,Δ,k) with (pi1,Δ,1) and (if k>1(pi1+Δ,Δ,k1) replace  ( p i − 1 , Δ , k )  with  ( p i − 1 , Δ ′ , 1 )  and (if  k > 1 )  ( p i − 1 + Δ , Δ , k − 1 )

其中 Δ Δ ′ pi1 p i − 1 Pj P j 中新的差值

G′′j G j ″ Gj G j ′ 经过上述变换的结果,可以看出差值的维护已经基本无误了,接下来只需要合并差值相等的三元组,就可以通过 G′′j G j ″ 得到正确的 Gj G j

引理7

Gj G j 可由 Gj1 G j − 1 O(|Gj1|)=O(|logj|) O ( | G j − 1 | ) = O ( | log ⁡ j | ) 时间计算出

上述7个引理足够维护 Gj G j ,接下来解释如何通过 Pj,Δ P j , Δ PjΔ,Δ P j − Δ , Δ 的联系快速转移DP值

引理8

若有 (i,Δ,k)Gj,k2 ( i , Δ , k ) ∈ G j , k ≥ 2 ,则有 (i,Δ,k1)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{PLi1+1:iPj,Δ} P L j , Δ = min { P L i − 1 + 1 : i ∈ P j , Δ } PLi P L i 表示第 i i 个前缀的最小回文分解大小。我们把PLj,Δ存在 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

m=minPj,ΔΔ l[jΔ+1,j1],mPl ∀ l ∈ [ j − Δ + 1 , j − 1 ] , m ∉ P l

易证

综上,我们有

定理10

最小回文分解可以用 O(nlogn) O ( n log ⁡ n ) 时间 O(n) O ( n ) 空间计算

没懂可以看论文里的伪代码

后面的东西暂时不感兴趣,不翻了

例题:

Codeforces Round #454 div1 E Reverses

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值