Manacher 算法模板
簡介
在字符串的題目中,有時會遇上 回文串 這樣一個名詞
顧名思義,回文串 就是 正讀和反讀都一樣的字符串
而 最長回文子串 ,就是在一個字符串的所有子串中,是回文串且長度最長的那個
求最長回文子串最普通的方法是 O(N2) ,即枚舉一個點往兩邊擴展
但是在有些題目中,N 卻十分的大
那么我們就要用到 時間空間復(fù)雜度都是 O(N) 的 Manacher 算法
用法
在處理回文串時,我們常常會被 中間字符是一個還是兩個 這樣的問題困擾
但是在機智的 Manacher 算法 中,這個問題得到了完美的解決
在每兩個字符中間插入一個不會出現(xiàn)的分隔符(如:#)
之后在頭尾插入一個還是沒有出現(xiàn)的分隔符(如:*)來防止 While 出界
這樣處理起來就方便很多了!
設(shè)讀入的字符串為 s[i] ,
記錄 p[i] 表示 以 s[i] 為中心往兩邊擴展的最大長度
觀察可知,實際的回文串長度即為當(dāng)前的 p[i]?1
再記錄一個數(shù) id , p[id]+id表示在 i 位置前所有回文串中能延伸到的最右端的位置
如下圖:
算法核心就是:
if(p[id]+id>i) p[i]=min(p[id?2?i],p[id]+id?i); else p[i]=1;
當(dāng)之前所有回文串中能延伸到的最右端覆蓋過 i 時,則取最小值,否則 p[i]=1 ,及自己本身
這樣不斷維護(hù) p[i] 和 id ,就能在 O(N) 內(nèi)求出 最長回文子串 了!
至于為什么時間是線性的,由于最有端 p[id]+id 最多只能移動 N 次,
有效移動的操作就嚴(yán)格線性啦!!
下面附上模板:
- 注釋:s[i],p[i],id 如題意義,ans 表示 最長回文子串 的長度,而 len 是原串長度
總結(jié)
這個 Manacher 算法效率極高,時間空間都是 O(N) 線性的
再者代碼極短,所以使用起來十分方便,應(yīng)多多使用!!!
總結(jié)
以上是生活随笔為你收集整理的Manacher 算法模板的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdu3068 . 最长回文
- 下一篇: JZOJ 3158. 【JSOI2013