構造
和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...