最長回文長度 manacher(馬拉車)

2021-10-08 22:20:22 字數 1264 閱讀 4895

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

回文就是正反讀都是一樣的字串,如aba, abba等

input

輸入有多組case,不超過120組,每組輸入為一行小寫英文本元a,b,c…y,z組成的字串s

兩組case之間由空行隔開(該空行不用處理)

字串長度len <= 110000

output

每一行乙個整數x,對應一組case,表示該組case的字串中所包含的最長回文長度.

sample input

aaaa

abab

sample output43

題意:求最長回文串長度

演算法:manacher(馬拉車)

**:

#include

#include

#include

using

namespace std;

const

int m=

1000010

;int p[m]

;///記錄以i為中心的最大回文半徑

char a[m]

;///原始字串

char b[m]

;///優化字串

void

manacher()

b[k]=0

;///目的:設定邊界

///第二階段:尋找最大回文串的長度

int id=

0,mx=0;

///mx為以id為中心的最右邊的邊界:mx=id+p[id];

int len=0;

///記錄最大回文串長度

for(i=

1;i)else

p[i]=1

;///如果i出id的右邊界,則初始回文半徑為1

while

(b[i+p[i]

]==b[i-p[i]])

///不需要判斷邊界,因為左有$,右有0

p[i]++;

///判斷界外關於i對稱字元是否相等,相等回文半徑長度增加

if(p[i]

>mx-i)

///判斷i的右邊界和id右邊界的大小

if(p[i]-1

>len)

///p[i]-1為回文串的長度

len=p[i]-1

;///更新最大長度

}printf

("%d\n"

,len);}

intmain()

牛客14894 最長回文 manacher馬拉車

有兩個長度均為n的字串a和b。可以從a中選乙個可以為空的子串a l1 r1 b中選乙個可以為空的子串b l2 r2 滿足r1 l2,然後把它們拼起來 a l1 r1 b l2 r2 求用這樣的方法能得到的最長回文串的長度。注意 求的不是本質不同的回文串個數哦!第一行乙個數n 第二行表示字串a 第三行...

manacher演算法求最長回文串長度

manacher演算法 定義陣列p i 表示以i為中心的 包含i這個字元 回文串半徑長 將字串s從前掃到後for int i 0 i由於s是從前掃到後的,所以需要計算p i 時一定已經計算好了p 1 p i 1 假設現在掃瞄到了i k這個位置,現在需要計算p i k 定義maxlen是i k位置前所...

Manacher 最長回文子串

最長回文子串問題 給定乙個字串,求它的最長回文子串長度。如果乙個字串正著讀和反著讀是一樣的,那它就是回文串。下面是一些回文串的例項 12321 a aba abba aaaa tattarrattat 牛津英語詞典中最長的回文單詞 對於最長回文子串問題,最簡單粗暴的辦法是 找到字串的所有子串,遍歷每...