BZOJ2565 最長雙回文串 Manacher

2022-05-20 19:01:47 字數 1187 閱讀 3122

順序和逆序讀起來完全一樣的串叫做回文串。比如acbca是回文串,而abc不是(abc的順序為「abc」,逆序為「cba」,不相同)。

輸入長度為n的串s,求s的最長雙回文子串t,即可將t分為兩部分x,y,(|x|,|y|≥1)且x和y都是回文串。

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

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

baacaabbacabb

12樣例說明

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

對於100%的資料,2≤|s|≤10^5

題解:網上好多題解都是回文樹,回文自動機,感覺沒有必要啊!直接上manacher演算法

由於雙回文串是將兩個回文串拼在一起得到,我們可以列舉中間的'*'點,預處理出以它結尾的最長回文串和以它開頭的最長回文串,然後加在一起更新答案。由於求以它結尾的回文串和以它開頭的回文串是互部影響的,我這裡只說怎麼求以它結尾的最長回文串,這裡用ls[j]表示。

當我們用manacher演算法求出回文中心i的回文半徑rl[i]後,那麼在(i,i+rl[i])內的字元都可以用 以i為中心的回文串 來結尾,(就是說以i為中心的回文串能以(i,i+rl[i])內的字元結尾,以(i,i+rl[i])內字元結尾的最長回文串可能以i為中心)

但是我們不能用i乙個乙個更新以(i,i+rl[i])內的字元結尾的最長回文串長度啊,但是我們發現,以i+rl[i]結尾的回文串長度為rl[i]-1(不算中間的'*'),以i+rl[i]-2結尾的回文串長度自然就是rl[i]-1-2(再說一遍,不算中間的'*')。然後我們只需要從左到右掃一遍,令ls[i]=max(ls[i],ls[i-2]-2)就行啦!

感覺說了這麼多也沒有直接看**簡單明瞭

#include #include #include using namespace std;

char s1[500010],str[1000010];

int n,len,rl[1000010],mx,pos,ls[1000010],rs[1000010],ans;

int main()

for(i=0;i=0;i-=2) ls[i]=max(ls[i],ls[i+2]-2);

for(i=0;iprintf("%d",ans);

return 0;

}

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。一行乙個整數,表示最長雙回文子串的長度。...