基礎知識:
step[i]表示的是字串i在原字串中的位置。
pareint[i]表示root到parent[i]的子串是root到i的最長字尾。
字尾自動機遍歷可以得到原字串的所有子串。
特殊技巧:
一.字尾自動機的不同子串數有兩種求法:
1. ans = step[i]–step[parent[i]] (1<=i<=cnt)
2. ans[i] = ans[son[i][1]]+ans[son[i][2]]+…..(倒序遞推才行)。
這兩種求法各有千秋,第一種求法方便,但是第二種求法不僅可以求出總的不同的子串數,還可以求出從每個狀態s開始有多少不同的子串。(如:諸神眷顧的幻想鄉和弦論)。
二.字尾自動機支援構建字元樹,即可以知道這棵樹上從深度小的點到深度大的點的所有子串(所以說並不僅僅侷限於乙個字串!)構建方法就是同乙個節點的兒子節點以同乙個last進行構建。
三.字尾自動機也支援多串匹配,即可以把多個串都丟到乙個自動機上去,我們就可以獲得所有串在一起的不同子串個數了。
四.字尾自動機到某個點的所有路徑一定都是互相包含的關係。
字尾自動機
常用於處理字串問題,可以高效解決許多字串問題。有點像將乙個字串的所有字尾都建在乙個ac自動機上,但不同的是字尾自動機的節點數最多為2 n,因為它只記錄需要記錄的點,一些沒有記錄東西的點可以視為與下面有價值的節點並在一起,這樣大大降低了時間複雜度和空間複雜度。對於每乙個節點記錄它的後面加上每個字元後字...
字尾自動機
基礎學習 簡潔明瞭的講解 總狀態數不超過2n 12n 1 2n 1 包括初始狀態 統計每個end po sendpos endpos 等價類出現位置數量時,要按長度從長到短的計算cnt cntcn t。那為什麼一定要從長到短呢?比如回文自動機就直接是按照節點編號從大到小計算cnt cntcn t 罪...
字尾自動機
include include includeusing namespace std const int n 1000000 10 char s n int len 2 n tr 2 n 32 link 2 n con 2,last 1 void add int c int main return ...