馬拉車 Manacher 演算法 求最大回文子串

2021-09-12 21:08:13 字數 1354 閱讀 6269

馬拉車(manacher)演算法是一種時間複雜度為o(n)的求字串中的最大回文子串的演算法,

他很好的利用了回文串是關於中間字元對稱的特點進行了剪枝操作,把時間複雜度優化到了o(n),並且它可以無差別處理奇偶字串。

uestcacm 每週演算法講堂 manacher演算法1(原理和思想)

uestcacm 每週演算法講堂 manacher演算法2(**與實現)

其實最關鍵的就是下面的這些

圖一

圖二一、mx > i

假設當前遍歷到字串的位置i,由於在遍歷到id位置的時候已知最大回文子串,位置i還在上乙個最大回文子串的範圍內,所以可以利用其映象認為,位置i以id為中心映象到另一邊的位置j是對等的。 在mx>i的條件下,又分為以下兩種情況:

1. mx - i > p[j] (圖1)

此時,以j為中心的回文子串包含在以id為中心的回文子串內,由於i和j位置對等,所以以i為中心的回文子串包含在以id為中心的回文子串內,所以p[i] = p[j] = p[2 * id - i]。

2. mx - i <= p[j] (圖2)

此時,以j為中心的回文子串超過了以id為中心的回文子串邊界,但是由於i和j位置對等,綠框部分還是相同的。所以其向右延伸的範圍最大就是mx-i,剩下超過的部分誰也不能保證是否一致,只能通過迴圈對比判斷,所以p[i] = mx - i。

二、mx < i

此時映象對預判位置起不到作用,只能從長度為1開始對比,所以p[i] = 1。

然後我就直接附上板子了。

#include

using

namespace std;

const

int maxn =

3e3;

char s[maxn]

,str[maxn]

;int len1,len2,p[maxn]

;void

manacher()

}}void

init()

len2 = len1*2+

2;str[len2]

='*';}

intmain()

cout << ans-

1<< endl;

}return0;

}

Manacher 馬拉車演算法

給定乙個字串,求出其的最長回文子串 乙個將時間複雜度優化到o n 的演算法 暴力演算法,但不是純暴力,即按照做過的事情不再去做來優化 我們知道,乙個回文串要麼是奇數的串 aba 要麼是偶數的串 abba 可以看出,乙個回文串有乙個對稱軸 對於奇數串aba來說,對稱軸就是b 而對於偶數串abba來說,...

Manacher演算法(馬拉車)

演算法總結第三彈 manacher演算法,前面講了兩個字串相演算法 kmp和拓展kmp,這次來還是來總結乙個字串演算法,manacher演算法,我習慣叫他 馬拉車 演算法。相對於前面介紹的兩個演算法,manacher演算法的應用範圍要狹窄得多,但是它的思想和拓展kmp演算法有很多共通支出,所以在這裡...

馬拉車演算法manacher

1.預處理解決奇回文和偶回文問題 比如 str bcbaa 在每個字元的開頭,結尾和中間插入乙個特殊字元 來得到乙個新的字串 b c b a a 這樣對於原來字串中的奇回文 bcb 來說,在新的字串中變成了 b c b 還是奇回文,只是回文串長度從3變成了7 注意 中 i 1 0,與1按位與,如果i...