1. 程式人生 > 實用技巧 >字尾自動機做題技巧

字尾自動機做題技巧

字尾自動機做題技巧

①字尾自動機的總狀態數小於\(2n\),總轉移邊數小於\(3n\)

②字尾自動機沿著 link 連結跳的總複雜度為\(O(n)\),構造字尾自動機的總複雜度也是\(O(n)\)

性質:

①插入字元新增子串數:len[p]-len[link[p]]

②字尾連結:link[p]表示的字串是p的字尾

③沿著轉移陣列走,可以得到母串的所有子串。

④沿著字尾連結走,一直得到的是當前點的字尾串。

⑤如果把非clone點的cnt[i]值置為1,然後沿著字尾連結的反向邊 dfs 一遍,把其子節點的貢獻都加到自己身上,最後得到的cnt[i]就是 i 這個節點所表示的串在母串中出現的總次數。因為子節點的結束下標肯定是跟 i 不同的(除了clone節點),而 i 所表示的字串是子節點表示字串的子串,所以把貢獻加以來就可以了。

⑥求第 i 個節點所表示串的出現個數(本質相同,位置不同也可):先將所有非克隆節點的cnt[i]置為1,然後在後綴樹上跑 dfs ,把 i 的子樹的貢獻加到自己身上即可。

⑦求第 i 個節點所表示串的出現個數(本質相同,位置不同算一個串):將所有(包括克隆節點)的cnt[i]置為1即可。