BZOJ 2565 最長雙回文串

2021-08-31 07:11:09 字數 1309 閱讀 1818

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

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

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

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

sample input

baacaabbacabb

sample output

12樣例說明

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

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

這是個裸題,求兩個連在一起的回文串的最長長度。

我們可以用回文樹來求的

第 i 個字母之前的最長回文串的長度是多少,

然後倒這來就可以求得

第 i 個字母之後的最長回文串的長度是多少,

兩個加起來就好了。

這個是回文樹的一些主要陣列。

fail 失配指標。像ac自動機差不多的失配指標,這個指向的是同樣回文串結尾的最長回文串。

len 當前回文串的長度。

s 乙個個加入新的字母。

n 當前加入的是第幾個字元。

p 當前是第幾個節點。

num[i] 代表 i 這個節點所代表的回文串中有多少個本質不同的回文串。

cnt[i] 代表 i 這個節點所代表的回文串一共出現了多少次。 這個最後要 count() 一下。

#include

using

namespace std;

const

int n =

1e5+

1000

;int next[n][30

],fail[n]

,len[n]

;int s[n]

,last,n,p,num[n]

,cnt[n]

,sum[n]

;int s1[n]

,s2[n]

;int

newnode

(int x)

void

init()

intgetfail

(int x)

intadd

(int c)

last = next[cur]

[c];

cnt[last]++;

return len[last];}

void

count()

intmain()

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 最長雙回文串

題意 給出乙個字串s ss,求s ss的最長雙回文子串t tt,即可將t tt分為兩部分x xx,y yy,x y 1 x y 1 x y 1 且x xx和y yy都是回文串。題解 我們知道len i len i len i 表示以i ii這個字元結束的最長回文串的長度,然後我們只需要建立兩個回文自...