回文自動機模板

2021-09-24 04:08:10 字數 1235 閱讀 6072

回文自動機每個節點代表了乙個回文串

能求出來的有:

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...