給出乙個只由小寫英文本元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 牛津英語詞典中最長的回文單詞 對於最長回文子串問題,最簡單粗暴的辦法是 找到字串的所有子串,遍歷每...