1. 程式人生 > 其它 >守護石談學習Java之路

守護石談學習Java之路

123

AC 自動機

目錄

自動機

OI 中「自動機」一般指「確定性有限狀態自動機」(deterministic finite automaton,DFA)

基本定義

DFA 一般是識別字符串,一個自動機 \(A\),若他能識別字符串 \(S\),則 \(A(S)=1\),否則 \(A(S)=0\) .

然後這個識別咋定義呢?當一個自動機讀入一個字串時,從初始狀態(根節點)起按照轉移函式一個一個字元地轉移 . 如果讀入完一個字串的所有字元後位於一個接受狀態,那麼我們稱這個自動機 接受 這個字串,反之我們稱這個自動機 不接受 這個字串 .(這個接受其實就是識別吧)

形式化定義

其實弄懂了基本定義,形式化定義就很明瞭了 .

一個 DFA 由如下五個東西

  • 狀態集合 \(Q\) .
  • 字符集 \(\Sigma\) .
  • 狀態轉移函式 \(\sigma : Q\times \Sigma\to Q\) .
  • 一個開始狀態 \(s\in Q\)(即根節點)
  • 接收狀態集合 \(F\subseteq Q\) .

組成的五元組 \((Q,\Sigma,\sigma,s,F)\) .

常見自動機

  • Trie:轉移函式就是 Trie 上一條邊,其能接受的字串就是插入到 Trie 中的字串(或者其字首,這取決於怎麼定義接受)
  • 子序列自動機:能接受的字串是給定字串的所有子序列,轉移函式 \(trans(x, c)\)
    是在字元 \(c\) 對應的 \(\texttt{vector}\)\(\texttt{upper_bound}(x)\) 得到的返回值 . 每個節點都可以看作接受狀態 .
  • KMP 自動機:\(s\) 構造 的自動機能接受的字串是以 \(s\) 為子串的串 \(t\),轉移函式就是不斷跳 next 的過程(形式化的,here

然後就是我們現在要說的 AC 自動機,還有比較牛逼的(廣義)字尾自動機(SAM),迴文自動機(PAM)啥的,然而我不會啊 qwq

Reference


以下是部落格簽名,正文無關

本文來自部落格園,作者:Jijidawang,轉載請註明原文連結:https://www.cnblogs.com/CDOI-24374/p/15968827.html

看完覺得有用請點個贊吧,求求了,這對我真的很重要