回文自動機

2022-06-19 01:36:09 字數 964 閱讀 8136

構造

和ac自動機及其類似

相比manacher,它還可以統計某個回文子串的數量,結尾為\(i\)的回文串數量,大小(更方便)

乙個字串總共有有\(n\)個本質不同的回文串

證明:對於每個右端點\(i\),每次只有多出至多\(1\)個回文串,多出的是最長的回文串

因為其他的均能通過在最長串中點對稱,找到相應的右端點在之前的回文串,所以至多只有\(1\)個

根據上述結論,只要找出所有右端點對應的最長回文串,即可找到所有本質不同的回文串(manacher擴充套件r時)

這樣就可以以本質不同的回文串作為節點,正好完全包括了全部的字串且不重不漏

顯然fail指標指向上乙個回文串字尾

luogu p3649 [apio2014]回文串

注意nxt一定最後賦值

#include#define ll long long 

using namespace std;

const int n=3e5+5;

int n,lst,tot,len[n],pa[n],nxt[n][26],c[n],b[n];

ll a[n];

char s[n];

inline void pam(int ch,int n)

lst=nxt[u][ch];

a[lst]++;

}int main()

for(int i=2;i<=tot;i++) c[len[i]]++;

for(int i=2;i<=n;i++) c[i]+=c[i-1];

for(int i=tot;i>1;i--)

for(int i=tot-1;i>=1;i--)

ll ans=1;

for(int i=2;i<=tot;i++)

printf("%lld\n",ans);

return 0;

}

回文自動機

回文自動機,又叫回文樹,是由俄羅斯人 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...