本文翻譯自這篇論文
譯者水平有限,如有錯漏,還望指出
論文中有僞代碼可以幫助理解
衆所周知,字符串的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+1−pi ,那麼有
引理5
Pj 的差值單調不增,且最多有O(logj) 種取值
由引理4顯然
對每個不同的差值Δ ,定義Pj,Δ={pi:1<i≤m,pi−pi−1=Δ} , 特殊的, Pj,∞={p1} ,每一個Pj,Δ 可以表示爲三元組(minPj,Δ,Δ,|Pj,Δ) ,將三元組按Δ 降序記在鏈表Gj 中
那麼由引理5,Gj 的大小是O(logj) 的,接下來證明Gj 能用O(|Gj−1|) 時間從Gj−1 推過來。衆所周知,每個i∈Pj−1 要麼被i−1∈Pj 替代要麼被刪除,那麼有
引理6
令pi 和pi+1 爲Pj−1,Δ 中的相鄰元素,pi−1∈Pj 當且僅當pi+1−1∈Pj
易證
有了引理6,可以想象,三元組(i,Δ,k)∈Gj−1 或被刪除或被替換爲(i−1,Δ,k) ,也即
G′j={(i−1,Δ,k):(i,Δ,k)∈Gj−1,i>1,and Si−1=Sj}
但是,我們的新三元組似乎有些不合定義,需要做一些調整:若pi∈Pj−1,Δ 被pi−1 替換,而pi−1=pi−Δ∈Pj−1 被刪除,那麼pi−1 就不應該在Pj,Δ 裏。注意到只有每組第一個元素可能需要調整,故我們分裂出每組第一個元素,即
replace (pi−1,Δ,k) with (pi−1,Δ′,1) and (if k>1) (pi−1+Δ,Δ,k−1)
其中
Δ′ 爲
pi−1 在
Pj 中新的差值
令G′′j 爲G′j 經過上述變換的結果,可以看出差值的維護已經基本無誤了,接下來只需要合併差值相等的三元組,就可以通過G′′j 得到正確的Gj 了
引理7
Gj 可由Gj−1 用O(|Gj−1|)=O(|logj|) 時間計算出
上述7個引理足夠維護Gj ,接下來解釋如何通過Pj,Δ 和Pj−Δ,Δ 的聯繫快速轉移DP值
引理8
若有(i,Δ,k)∈Gj,k≥2 ,則有(i,Δ,k−1)∈Gj−Δ
畫圖可證
由引理8,若|Pj,Δ≥2| 則Pj,Δ=Pj−Δ,Δ∪{maxPj,Δ} ,憑此即可在常數時間利用PLj−Δ,Δ 計算PLj,Δ=min{PLi−1+1:i∈Pj,Δ} 。PLi 表示第i 個前綴的最小回文分解大小。我們把PLj,Δ 存在GPLm,m=minPj,Δ−Δ 中,顯然當|Pj,Δ|≥2 的時候PLj,Δ 和PLj−Δ,Δ 對應下標相同,接下來證明一個引理,來說明在j−Δ 到j 中不會有其他時刻訪問此位置
引理9
令m=minPj,Δ−Δ ,∀l∈[j−Δ+1,j−1],m∉Pl
易證
綜上,我們有
定理10
最小回文分解可以用O(nlogn) 時間O(n) 空間計算
沒懂可以看論文裏的僞代碼
後面的東西暫時不感興趣,不翻了
例題:
Codeforces Round #454 div1 E Reverses