最小回文分解NlogN算法

本文翻譯自這篇論文
譯者水平有限,如有錯漏,還望指出
論文中有僞代碼可以幫助理解
衆所周知,字符串的border有和等差數列相關的一些性質(border group),可以參考2015年集訓隊論文集裏的《淺談字符串匹配的幾種方法》一文,迴文串的迴文border也有類似的性質。

tips:
真後綴定義類似真子集

下面給出算法所用到的幾個引理
引理1
令y爲迴文串x的後綴,y是x的border當且僅當y是迴文串
證明顯然
引理2
令y爲x的後綴且|x||2y| ,x是迴文串當且僅當y是迴文串
證明顯然
引理3
令y爲x的真後綴,|x||y| 是x的循環節當且僅當y是迴文串
顯然
引理4

令y爲迴文串x的最長迴文真後綴,z爲y的最長迴文真後綴,不妨令x=uy,y=vz ,那麼有

(1)|u||v|

(2)if|u|>|v|,|u|>|z|

(3)if|u|=|v|,u=v

由前三個引理可證

有了上述4個引理,我們可以類似border group搞事情

對於一個前綴S1,j ,定義Pj 爲下標集合{p1,p2...pm},p1<p2<...<pm 表示S1,j 的所有迴文後綴的開頭,定義差值爲pi+1pi ,那麼有

引理5

Pj 的差值單調不增,且最多有O(logj) 種取值

由引理4顯然

對每個不同的差值Δ ,定義Pj,Δ={pi:1<im,pipi1=Δ} , 特殊的, Pj,={p1} ,每一個Pj,Δ 可以表示爲三元組(minPj,Δ,Δ,|Pj,Δ) ,將三元組按Δ 降序記在鏈表Gj

那麼由引理5,Gj 的大小是O(logj) 的,接下來證明Gj 能用O(|Gj1|) 時間從Gj1 推過來。衆所周知,每個iPj1 要麼被i1Pj 替代要麼被刪除,那麼有

引理6

pipi+1Pj1,Δ 中的相鄰元素,pi1Pj 當且僅當pi+11Pj

易證

有了引理6,可以想象,三元組(i,Δ,k)Gj1 或被刪除或被替換爲(i1,Δ,k) ,也即

Gj={(i1,Δ,k):(i,Δ,k)Gj1,i>1,and Si1=Sj}

但是,我們的新三元組似乎有些不合定義,需要做一些調整:若piPj1,Δpi1 替換,而pi1=piΔPj1 被刪除,那麼pi1 就不應該在Pj,Δ 裏。注意到只有每組第一個元素可能需要調整,故我們分裂出每組第一個元素,即

replace (pi1,Δ,k) with (pi1,Δ,1) and (if k>1(pi1+Δ,Δ,k1)

其中Δpi1Pj 中新的差值

GjGj 經過上述變換的結果,可以看出差值的維護已經基本無誤了,接下來只需要合併差值相等的三元組,就可以通過Gj 得到正確的Gj

引理7

Gj 可由Gj1O(|Gj1|)=O(|logj|) 時間計算出

上述7個引理足夠維護Gj ,接下來解釋如何通過Pj,ΔPjΔ,Δ 的聯繫快速轉移DP值

引理8

若有(i,Δ,k)Gj,k2 ,則有(i,Δ,k1)GjΔ

畫圖可證

由引理8,若|Pj,Δ2|Pj,Δ=PjΔ,Δ{maxPj,Δ} ,憑此即可在常數時間利用PLjΔ,Δ 計算PLj,Δ=min{PLi1+1:iPj,Δ}PLi 表示第i 個前綴的最小回文分解大小。我們把PLj,Δ 存在GPLm,m=minPj,ΔΔ 中,顯然當|Pj,Δ|2 的時候PLj,ΔPLjΔ,Δ 對應下標相同,接下來證明一個引理,來說明在jΔj 中不會有其他時刻訪問此位置

引理9

m=minPj,ΔΔl[jΔ+1,j1],mPl

易證

綜上,我們有

定理10

最小回文分解可以用O(nlogn) 時間O(n) 空間計算

沒懂可以看論文裏的僞代碼

後面的東西暫時不感興趣,不翻了

例題:

Codeforces Round #454 div1 E Reverses

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章