馬拉車(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...