字尾自動機是一種確定性有限自動機(dfa),它可以且僅可以匹配乙個給定串的任意字尾。
字尾自動機的增量演算法:
structview codesam
c )
else
else
}last =np;}};
字尾自動機構造完成之後,我們得到了4個東西:轉移dag,parent樹,每個點的right集合,每個點的字串集合的長度區間。(其中最後乙個可以由地乙個dp出來)
轉移dag最直接的用處是子串判定問題,因為它將原串的所有子串唯一的對映到了該dag上的某個節點,並且將該子串放到dag上跑,會跑到該節點。每個節點可能代表多個串。
可以在dag上進行dp,得出從某點開始最多匹配多少個本質不同的子串,如果再加上right集合,就可以算出普通字串個數(位置不同本質相同也算)。
轉移dag加上parent樹可以提供給我們訪問原串某個子串的所有子串的能力。
對於處理多個串的問題,我們可以先用分割符連線各個串,然後構造字尾自動機,並且重新定義乙個點代表的字串:原本的串去除帶有分割符的串,我們可以dp算出每個節點代表的串的數量以及長度區間。這樣可以通過剛才訪問子串的子串的方法訪問乙個串的所有子串。
總結 字尾自動機
最近刷了一下字尾自動機。題其實做了也不少了,稍微有一點理解。教練 得理解深刻 1.我個人認為 parent 樹其實是一顆虛樹 最近又學了虛樹,做了三道題 虛樹的思想是只留存關鍵點以及關鍵點的 lca parent 樹其實相當於字尾樹的虛樹,只留存了一些關鍵點。可以發現對於同乙個 right 集合來說...
字尾自動機
基礎知識 step i 表示的是字串i在原字串中的位置。pareint i 表示root到parent i 的子串是root到i的最長字尾。字尾自動機遍歷可以得到原字串的所有子串。特殊技巧 一 字尾自動機的不同子串數有兩種求法 1.ans step i step parent i 1 i cnt 2...
字尾自動機
常用於處理字串問題,可以高效解決許多字串問題。有點像將乙個字串的所有字尾都建在乙個ac自動機上,但不同的是字尾自動機的節點數最多為2 n,因為它只記錄需要記錄的點,一些沒有記錄東西的點可以視為與下面有價值的節點並在一起,這樣大大降低了時間複雜度和空間複雜度。對於每乙個節點記錄它的後面加上每個字元後字...