1. 程式人生 > >最小回文分解NlogN演算法

最小回文分解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|)時間從