自動機初步

2022-09-19 21:12:19 字數 1185 閱讀 9671

參考資料1

參考資料2

字串的下標從 \(0\) 開始。\(|s|\) 表示字串 \(s\) 的長度。

對於字串 \(s\),記其每乙個字元分別為 \(s_0, s_1, \cdots, s_\)。

子串 \(s_l, s_, \cdots, s_, s_r\) 簡記為 \(s[l:r]\)。特別地,若 \(l=0\),可記作 \(s[:r]\);若 \(r=|s|-1\),可記作 \(s[l:]\)。

對於字串 \(a, b\),\(a+b\) 表示拼接操作,即將字串 \(b\) 拼接到字串 \(a\) 之後,構成新的字串。

記構成的新字串為 \(c\),則上述拼接操作記為 \(c\gets a+b\)。

其中符號 \(x\gets y\) 表示將 \(y\) 的值賦給 \(x\)。

不論是字元還是字串,皆不加引號。

首先,我們需要明確自動機的概念。一般來說,oi中我們會接觸到的都是確定有限狀態自動機(dfa)。

dfa可以看成一張有向圖,圖上的節點稱為狀態(\(q\)),而從乙個狀態到另乙個狀態的有向邊稱為轉移。轉移方式由轉移函式(\(\delta\))進行規定。

dfa有乙個起始狀態(\(start\))和若干個接受狀態(\(f\))。當我們把規定字符集(\(\sigma\))中字元組成的字串輸入該dfa時,dfa會從起始狀態開始,依照轉移函式,逐個字元進行轉移。

若最終停在了接受狀態,稱該dfa接受該字串;否則稱該dfa不接受該字串。

從這裡可以看出,dfa就是用來識別字串的。

接下來我們對轉移函式進行形式化定義。轉移函式的形式為 \(\delta(u,c)=v\)。其中 \(u,v\) 都是狀態,而 \(c\) 代表字串中的字元。

如果我們不能從 \(u\) 狀態由字元 \(c\) 轉移到任何乙個狀態,我們稱 \(\delta(u,c)=\text\)。\(\text\) 不是接受狀態,且不能轉移到接受狀態,只能轉移到 \(\text\)。

我們還可以擴充套件轉移函式的定義,讓其第二個引數稱為字串,此時轉移函式的意義就為從 \(u\) 狀態開始,依次按照字串中字元進行轉移,最終到達的狀態。

形式化地,\(\delta(u,s)=\delta(\delta(u,s_0),s[1:])\)。

然而dfa理論並沒有幫助我們解決問題。

因此這裡我們討論一些實際應用中簡單的dfa。

trie樹就是最簡單的dfa。

字尾自動機模板(初步)

看了幾天居然連字尾自動機的構造原理和性質都沒完全搞懂。更不用說應用了。在這裡膜一下先輩clj大神 的ppt 大神的世界就是不懂。另外還要膜一下國家集訓隊的幾篇 作者,表示還沒看懂orz 先貼乙個講得通俗易懂的字尾自動機學習 蒟蒻的我居然仍然沒看懂 講得也夠詳細。學習 苦逼的我 乙個下午就死記硬背了這...

AC自動機及字尾自動機

ac自動機是一種基於trie樹的演算法,其本質和kmp上的處理很相似。trie樹結構 kmp轉移思路 ac自動機組要由三個部分組成 trie樹的建立 fail指標的匹配 對ac自動機的詢問 每次建立自動機會有一次初始化 ac自動機類 struct node node結構體 struct ac voi...

字尾自動機 序列自動機綜合

好像序列自動機還沒有寫過 串長為n的串共有n 1個節點,除了串中的n個節點,還有乙個空的根節點放在串首。每個節點至多有26條出邊,每條邊連向它之後的第乙個字元。串中的任意乙個子串行對應了一條根到某個節點的路徑。且每條路徑對應乙個不同的子串行。每個節點的parent是這個字母上一次出現的位置。更新只要...