Manacher 馬拉車演算法

2021-09-12 08:16:31 字數 809 閱讀 5048

給定乙個字串,求出其的最長回文子串;

乙個將時間複雜度優化到o(n)的演算法;

暴力演算法,但不是純暴力,即按照做過的事情不再去做來優化;

我們知道,乙個回文串要麼是奇數的串:aba ,, 要麼是偶數的串:abba;

可以看出,乙個回文串有乙個對稱軸;

對於奇數串aba來說,對稱軸就是b;

而對於偶數串abba來說,對稱軸在abba的兩個b之間,可我們又沒有儲存這兩個b之間的那個位置;怎麼辦呢:

於是我們將讀入的字串進行如下處理:

s=aba 那麼 str=$ #a#b#a#

s=abba 那麼 str=$ #a#b#b#a#

在每兩個單詞間插入乙個#號,$是乙個邊界;

#include

using

namespace std;

#define maxn 11000010

char s[maxn]

,str[maxn<<1]

;int len[maxn<<1]

,len1,len2;

inline

void

clean_()

inline

void

init_()

str[k++]=

'#';

len2=k;

}inline

intmanacher_()

}return

(sum-1)

;}intmain()

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...

Manacher演算法 馬拉車

於 馬拉車的解決的問題 給定字串s,求s中的最長回文子串?解釋 回文串就是正讀反讀都一樣的字串,比如奇回文串 bab 偶回文串 noon 馬拉車演算法步驟 index01 2345 6789 1011 1213 char 1 2 2 1 2 2 r121 2521 6123 21規律 最大半徑減1等...