陳立傑《字尾自動機》wc2012
原本我是會字尾自動機的太久沒寫所以忘得差不多了,事實證明板子要周周複習。
sam大致原理我就不多說了,相關的基本性質在其他講sam的blog都可以看到。
我們一般要對fail樹從下往上更新並詢問,那麼這個時候我們可以用到基數排序。
字尾樹就是反串建字尾自動機的fail樹,證明考慮在乙個字尾自動機上,fail樹上的一條鏈每個節點所選出的代表的串(也就是最長的串)是從短到長的,而且可以發現是不斷地加一段字首,然後有新貢獻rig的節點就是我們字尾樹上的葉子節點,當然這個可以用加特殊字元來解決貢獻rig的節點不是fail樹上的葉子節點,那麼相當於在字尾樹上加一段字尾,所以直接對反串建字尾自動機即可。
但是字尾樹沒用,這是實話,明顯可以發現字尾陣列就相當於字尾樹上葉子的dfs序,相鄰兩個的height就是相鄰兩個節點的lcp。
字尾自動機更適用於比較general的問題,而字尾陣列在解決和字典序有關的問題時特別好用。
一些簡單的例題就不再多說,乙個性質就是乙個節點新貢獻的right的數目最多是1,然後right集合的大小是fail樹上的子樹和,這個很好理解,於是對於n個串的最長子串什麼的,就可以用類似線段樹合併來直接做。
一道例題:
看似很難?直接拓撲排序後對a進行dp,因為字尾自動機上能夠表示所有的字串,所以沿著a往下走,直到走不動為止,然後跳到b的根繼續嘗試,直到在b的字尾自動機上也走不動為止。
然後就是子串行自動機,簡單易懂,直接維護下乙個字元跳到**連邊就可以。
一道例題。
直接用f[i][j]表示在第乙個自動機上走到第i個節點,j同理時的最小長度。
然後轉移直到b走不動為止,就更新答案。
字尾自動機
基礎知識 step i 表示的是字串i在原字串中的位置。pareint i 表示root到parent i 的子串是root到i的最長字尾。字尾自動機遍歷可以得到原字串的所有子串。特殊技巧 一 字尾自動機的不同子串數有兩種求法 1.ans step i step parent i 1 i cnt 2...
字尾自動機
常用於處理字串問題,可以高效解決許多字串問題。有點像將乙個字串的所有字尾都建在乙個ac自動機上,但不同的是字尾自動機的節點數最多為2 n,因為它只記錄需要記錄的點,一些沒有記錄東西的點可以視為與下面有價值的節點並在一起,這樣大大降低了時間複雜度和空間複雜度。對於每乙個節點記錄它的後面加上每個字元後字...
字尾自動機
基礎學習 簡潔明瞭的講解 總狀態數不超過2n 12n 1 2n 1 包括初始狀態 統計每個end po sendpos endpos 等價類出現位置數量時,要按長度從長到短的計算cnt cntcn t。那為什麼一定要從長到短呢?比如回文自動機就直接是按照節點編號從大到小計算cnt cntcn t 罪...