Manacher演算法總結

2021-08-01 08:48:47 字數 1326 閱讀 6765

manacher最主要的功能就是求一串字元中的最長回文子串的長度。

第一種:

int nextstr()      //對輸入的字串進行預處理,將字元中間插入乙個不可能出現的字元。

s[0]='&';            //為了防止字串越界,所以將儲存字元的字串開頭的賦值為另乙個不同的字元。

int n=strlen(str);

for(int i=1;i<=n*2;i+=2){

s[i]='#';

s[i+1]=str[i/2];

s[n*2+1]='#';    //最字串最後的進行處理。

s[n*2+2]='\0'; 

return n*2+1;

int manacher ()         // manacher這是演算法的主體部分;

int i,j,maxx=0,id=0;

int len=nextstr();               //len記錄的是處理之後字串的長度;

for(i=1;i<=len;i++){

if(id+q[id]>i)

q[i]=min(q[id]+id-i,q[2*id-i]);             //如果i點在以id為中心的回文字串的長度範圍之內,則去i點到邊界的值和i點關於id點對稱的點的回文串的長度;

else q[i]=1;

while(s[i+q[i]]==s[i-q[i]])            //找出以i點中心的字元子串的長度;

q[i]++;

maxx=max(maxx,q[i]);              //記錄最長的回文串的長度;

if(q[i]+i>id+q[id])

id=i;

return maxx-1;

第二種:                   //這種方法和第一中的差別不打,最主要的差別是對字串處理的函式上,第一中方法處理後需要用乙個新的字串來儲存,而第二種方法則直接在原來字串中修改;

void change ()

for(int i=len;i>=0;i--){

str[i*2+1]='#';

str[i*2+2]=str[i];

void manacher ()

int i,j,id=0;

for(i=2;i<=len*2+1;i++){

if(p[id]+id>i)

p[i]=min(p[2*id-i],p[id]+id-i);

else p[i]=0;

while(str[i-p[i]]==str[i+p[i]])

++p[i];

if(id+p[id]id=i;

Manacher演算法總結

所謂回文串,簡單來說就是正著讀和反著讀都是一樣的字串,比如abba,noon等等,乙個字串的最長回文子串即為這個字串的子串中,是回文串的最長的那個。下面介紹manacher演算法的原理與步驟。首先,manacher演算法提供了一種巧妙地辦法,將長度為奇數的回文串和長度為偶數的回文串一起考慮,具體做法...

Manacher演算法總結

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

manacher演算法總結

原文 1 len陣列簡介與性質 manacher演算法用乙個輔助陣列len i 表示以字元t i 為中心的最長回文字串的最右字元到t i 的長度,比如以t i 為中心的最長回文字串是t l,r 那麼len i r i 1。對於上面的例子,可以得出len i 陣列為 2 len陣列的計算 首先從左往右...