BZOJ2565最長雙回文串 manacher

2022-05-08 03:18:07 字數 1129 閱讀 9866

順序和逆序讀起來完全一樣的串叫做回文串。比如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

我們假設中間新增的間隔字元是'&',那麼只要知道以每個'&'結尾和開頭的最長回文串長度之和然後取最大值即可得到答案。因為求以每個'&'結尾和開頭的最長回文串的方法一樣,所以我們以求結尾的為例(變數名為$lmx$)。對於第$i$個字元,它的回文半徑為$l_$,那麼$[i,i+l_-1]$的$lmx$都會更新,但顯然不能乙個乙個更新。我們發現對於$lmx[i+l_-1]$會被$l_-1$更新(去掉回文串中的'&'),而$lmx[i+l_-3]$會被$l_-3$更新,所以只要$lmx[i]=max(lmx[i],lmx[i+2]-2)$這樣從右往左更新一遍即可,求開頭的同理。注意要保證雙回文串的兩個回文串都非空。

#include#include#include#include#include#include#include#include#include#include#include#define ll long long

using namespace std;

char s[200010];

int n;

int len[200010];

int l[200010];

int r[200010];

int ans;

int mx,num;

int main()

n=n<<1|1;

s[0]='%';

s[1]='&';

s[n+1]='^';

for(int i=1;i<=n;i++)

if(mx=1;i-=2)

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

printf("%d",ans);

}

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