字尾自動機基本概念

2021-08-28 09:06:08 字數 1460 閱讀 6270

hihocoder已經講的很清楚了,這裡就簡略的描述一下吧

對於字串s = "aabbabd",它的字尾自動機是:

圖中可以看出一些性質:

從s出發到終結點9總共有7條不同的路徑,其中每條路徑都對應著"aabbabd"中的乙個字尾,無遺漏且不重複,注意每乙個終結點綠色虛線所指向的點仍然是終結點(這個可以以後再理解為什麼,很顯然該中的終結只有9和s)

對於s所有的子串,一定能在自動機中找到一條從s出發的路徑

同理,對於所有不屬於s的子串,一定不能在自動機中找到一條從s出發的路徑(例如"aba"不是"aabbabd"的子串,就無法找到其從s出發的合法路徑)

節點個數≥字串中字元個數

除此之外,綠色的虛線不屬於fda(確定性自動機),但它是sam的重要部分

(1)endpos:對於s的乙個子串st,endpos(st) = st在母串s中所有出現的結束位置集合

對於例子字串s = "aabbabd",所有endpos構成的表如下

endpos的性質:

對於s的兩個子串s1和s2,如果len(s1) ≤ len(s2),那麼s1是s2的字尾當且僅當endpos(s2) ⊆ endpos(s1),s1不是s2的字尾當且僅當endpos(s1) ∩ endpos(s2) = ∅,例如圖中以節點8結尾的所有串("ab")都一定是圖中以節點7結尾的所有串("aabbab", "abbab", "bbab", "bab")的字尾

(2)longest(k)/shortest(k):s到節點k的所有子串中,最長的那個和最短的那個

例如longest(7) = "aabbab",shortest(7) = "bab"

再通過endpos,就可以看出子串是如何劃分的了,還有它們的一些性質:

(3)trans(k, ch):longest(k)後面接上字元ch,得到的新字串所在的節點

例如圖中trans(1, 'a') = 2,trans(1, 'b') = 8,trans(6, 'b') = 7

suffix links即圖中的綠色虛線

很容易發現(上面也說了):對於當前節點k,longest(k)到shortest(k)一定是一段連續的字尾,例如節點為7的所有子串就是從"aabbab"到"bab"這一段連續的字尾,而這段連續的字尾到shortest()後就截斷了,用直白的話說:7號節點中所有子串"aabbab", "abbab", "bbab", "bab",下個串應該是"ab",而串"ab"在8號節點中,那麼7到8就要連一條suffix links,pre[7] = 8

幾個很重要的性質:

字尾自動機

基礎知識 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 罪...