回文自動機每個節點代表了乙個回文串
能求出來的有:
1 本質不同的回文串的個數(tot - 1)
2 每種回文串出現的次數(cnt陣列)
3 每種回文串的長度 (len陣列)
4 以當前節點為字尾的回文串個數 (sed陣列)
5 每個回文串在原串出現的位置 (record陣列)
#include using namespace std;
const int n = 3e5 + 10;
typedef unsigned long long ull;
typedef long long ll;
char s[n];
int record[n];
struct palindrome_tree
void build()
int getfail(char *s, int x, int n)
void insert(char* s, int n)
last = nxt[p][c]; // 當前節點成為上乙個節點
cnt[last]++; //當前節點回文串++
record[last] = i;
} }void get_cnt()
}pdt;
int main()
return 0;
}
對於init,如果組數過多,可能會導致超時(例如uvalive - 7041 the problem to slow down you)
所以有乙個newnode的版本,即每次新建節點時,再初始化資訊。
struct palindrome_tree
int newnode(int lenx)
void build()
int getfail(char* s, int x, int n)
void insert(char* s, int n)
last = nxt[p][c];
cnt[last]++;
} }void get_cnt()
}pdt;
回文自動機
回文自動機,又叫回文樹,是由俄羅斯人 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...