bzoj2565最大雙回文串

2021-06-22 22:39:24 字數 1691 閱讀 9495

順序和逆序讀起來完全一樣的串叫做回文串。比如

acbca

是回文串,而

abc不是(

abc的順序為

「abc」

,逆序為

「cba」

,不相同)。

輸入長度為n的串

s,求s的最長雙回文子串

t,即可將

t分為兩部分x,

y,(|x|,|y|≥1)且x

和y都是回文串。

一行由小寫英文本母組成的字串s。

一行乙個整數,表示最長雙回文子串的長度。

baacaabbacabb

12樣例說明

從第二個字元開始的字串aacaabbacabb可分為aacaa與bbacabb兩部分,且兩者都是回文串。

資料規模及限制

對於10%的資料,2≤|s|≤103。

對於30%的資料,2≤|s|≤104。

對於100%的資料,2≤|s|≤105。

昨天看了stringoier的**,學習了manacher的演算法,這個演算法的神奇之處在於避免了許多不必要的 操作。而這一題恰巧也靈活的使用了這個演算法的思想。我最初的思想是

搞乙個lef陣列記錄以當前點為結尾的最長回文串,rig陣列記錄以當前點為開頭的最長回文串,時間複雜度o(n*n)

**如下

for(i=1;i

for(j=i;j>i-r[i];j--)

}

for(i=1;iif(left[i]+rig[i+1]-1>ans)

ans=left[i]+rig[i+1]-1;

後來無恥看了strongoier的**和部落格,以求lef陣列為例,他維護了乙個走的最右的區域,如果以當前點為中心的回文串沒有先前點的回文串長,則沒必要更新

**如下

for(i=1,j=3;ifor(;j// if(b[j]=='#')

c[j]=j-i;

for(i=len-1,j=len-2;i>=1;i--)

for(;j>=i-r[i]+1;j--)

if(c[j])

c[j]+=i-j;

for(i=1;iif(c[i]>ans)

ans=c[i];

bzoj2565 最長雙回文串

傳送門 manacher 奇怪的遞推 我也不清楚這算不算遞推 0.0 大體思路是記錄能到達每個字元的最早的對稱中心,然後根據在manacher的時候用當前回文串和前面相鄰的回文串來更新答案就好了 我邊界問題處理了好久,然而1a開森 code include define n 100005 char ...

BZOJ 2565 最長雙回文串

description 順序和逆序讀起來完全一樣的串叫做回文串。比如acbca是回文串,而abc不是 abc的順序為 abc 逆序為 cba 不相同 輸入長度為 n 的串s,求 s 的最長雙回文子串 t,即可將 t 分為兩部分x,y x y 1 且 x 和 y都是回文串。input 一行由小寫英文本...

BZOJ 2565 最長雙回文串

順序和逆序讀起來完全一樣的串叫做回文串。比如acbca是回文串,而abc不是 abc的順序為 abc 逆序為 cba 不相同 輸入長度為n的串s,求s的最長雙回文子串t,即可將t分為兩部分x,y,x y 1 且x和y都是回文串。一行由小寫英文本母組成的字串s。一行乙個整數,表示最長雙回文子串的長度。...