回文自動機入門題

2022-05-02 18:15:11 字數 1634 閱讀 7514

給你乙個長度為 n 的字串 s,下標從 1 開始;

輸出 n 個數,第 i 個數表示 1~i 內有多少個本質不同的回文串;

回文自動機入門題;

定義 ans[ i ] 表示 1~i 共有 $ans_$ 個本質不同的回文串;

$ans_=ans_$+;

ural1960.cpp

問題描述:

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

比如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

。時間限制:2秒

view code

列舉位置 i,求出以第 i 個字元為結尾的最長的回文串長度 $x_i$ 和以第 i+1 個字元為開始的最長回文串長度 $y_$;

最終答案為 $max\+y_\}$;

正向跑一邊回文自動機便可求出以第 i 個字元為結尾的最長回文串的長度;

反向跑一邊回文自動機便可求出以第 i 個字元為開始的最長回文串的長度;

1 #include2

using

namespace

std;

3const

int maxn=1e5+50;4

5strings;6

7///

a[0][i]:正向跑一邊,求出以第i個字元為結尾的最長回文串的長度

8///

a[1][i]:反向跑一邊,求出以第i個字元為開始的最長回文串的長度

9int a[2

][maxn];

1011

struct

pam12

27int getfail(int p,int

i)28

34void

init()

3544

45void pam(int

k)46

61 last=son[cur][s[i]];

6263 a[k][i]=len[last];64}

65}66}_pam;

67int

main()

68

view code

回文自動機

回文自動機,又叫回文樹,是由俄羅斯人 mikhailrubinchik於2014年夏發明的 這是一種比較新的資料結構,在原文中已有詳細介紹與 實現。回文樹其實不是嚴格的樹形結構,因為它有是兩棵樹,分別是偶數長度的回文樹和奇數長度的回文樹,樹中每個節點代表乙個回文串。為了方便,第一棵樹的根是乙個長度為...

回文自動機

乙個節點表示乙個回文串。tot 節點個數,即不同回文串的個數。兩棵樹,節點為0,1,所以最後計數時從2開始 n 新增的字元個數 last 新新增乙個字母後所形成的最長回文串表示的節點 nxt i c 節點i表示的回文串在兩邊新增字元c後變成的回文串編號 兒子 cnt i 節點i表示的本質不同的串的個...

回文自動機

小小總結 別忘了寫上初始化!當字串下標從0 00開始時,pos pospo s初始化為 1 1 1 若從1 11開始,則pos pospo s初始化為0 00 最終的pos pospo s代表最後乙個字元的下標 前者為n 1 n 1n 1,後者為n nn 根據本質不同的回文子串數量不超過 s s s...