理解manacher馬拉車演算法 洛谷p3805

2021-09-28 11:15:22 字數 1120 閱讀 2391

演算法複雜度為o(n),實際上只是初始化串一遍和走過串一遍,效率比字串雜湊和兩層for迴圈好的多。

具體詳情請參看注釋,適合之前已經了解馬拉車演算法,現在複習時看看。

洛谷p3805

題目描述

給出乙個只由小寫英文本元a,b,c…y,z組成的字串s,求s中最長回文串的長度.

字串長度為n

輸入格式

一行小寫英文本元a,b,c…y,z組成的字串s

輸出格式

乙個整數表示答案

#include

using namespace std;

char a[

11000000

+100

],b[

11000000*2

+200];

int mp[

11000000*2

+200];

//裡面最終存的是在這個串的這個位置的回文串長度+1

intmain()

b[cnt]

='0'

;// 初始化加#為了統一奇數串和偶數串的做法,加$和0為了不用判斷邊界條件,

// 切結,這三個字串不能在原字串**現

int mx =

0,id =0;

//mx的意義在於該串現階段最遠到達的位置,id是用於計算現在走到的位置的那個點通過現階段的中點位置的對稱位置,

//可以找到下標在**,通過那乙個位置串的回文串大小既可以得到現在位置可以到的最遠位置。

for(

int i =

0;i < cnt;i++

)else

while

(b[i+mp[i]

]== b[i-mp[i]])

//老老實實匹配的過程

mp[i]++;

if(i+mp[i]

>mx)

}printf

("%d\n",*

max_element

(mp+

1,mp+cnt)-1

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