ac自動機 匹配最長字首 高階 AC自動機詳解

2021-10-14 02:27:11 字數 1141 閱讀 4002

今天我們來介紹一點高階的知識——ac自動機。

ac自動機是什麼呢?是不是用了這個演算法,不管什麼題目都會自動ac呢?(別做夢啦~)

ac自動機,是aho-corasick automaton的簡稱,該演算法在2023年產生於貝爾實驗室,是著名的多模匹配演算法。ac自動機是對字典樹演算法的一種延伸,是字串中運用非常廣泛的一種演算法,但是noip一般不會涉及,多在省選及以上的比賽**現。

ac自動機比字典樹多維護乙個陣列——fail陣列。fail陣列的作用是指向當前節點表示的字串的字尾可以和模式串匹配上的最大長度的節點。是不是和kmp的next陣列有點相似?

kmp的next陣列是自己和自己的匹配,而ac自動機的fail陣列是自己和模式串(當然也包括自己)的匹配。看一下下面這張圖,應該會對fail陣列有深刻的理解。

ac自動機(紅邊為fail邊,黑邊為字典樹的邊)

這張圖中的紅色線條就是對應節點fail陣列所指向的節點,都指向了能和改字串字尾匹配的最長字首。

觀察上面的那張圖,乙個節點的fail指標(暫且這麼叫)指向的節點,和它的父節點(若u節點通過一步轉移能到達v節點,則稱u為v的父節點)fail指標指向的位置是有關係的。

既然只和父節點的fail指標有關,那麼我們採用佇列的資料結構和處理每個節點的fail指標。設當前節點為x。

struct node 

};class ac_machine

int get_id(node *x)

node *get_root()

node *get_nxt(node *x, int k)

node *get_fail(node *x)

void insert(char *c, int id)

now->id = id;

}void build() else }}

}private:

node *root, *emp;

void clean(node *ro)

}t;

ac自動機 匹配最長字首 多模匹配 AC自動機

精確的字串匹配演算法有 單模匹配演算法,比如,kmp bm演算法等 和 多模匹配演算法,比如,wu manber ac演算法等。ac演算法 aho corasick 是kmp演算法向多模式串情形的擴充套件,該演算法使用一種特殊的自動機,即ac自動機。ac自動機由一組模式串p生成,是trie的擴充套件...

字首函式,AC自動機

字首函式的應用。題目大意 我們都知道字首函式,但現在要求求出乙個更強大num陣列一一對於字串s的前i個字元構成的子串,既是它的字尾同時又是它的字首,並且該字尾與該字首不重疊,將這種字串的數量記作num i 其實只要找出最長符合要求字首即可,更短的一定是最長符合要求字首的字首,推字首函式時求乙個 字首...

AC自動機 建立nlogn個AC自動機

string set queries 題意 給你3種操作,1 加入乙個串到集合中。2 刪除集合中的某乙個串 3 查詢集合中的字串在給定的字串種出現幾次。同乙個串可重複 解法 建立多個ac自動機,用二進位制分組來處理。加入給你21個串 分為 16 4 1,再新增乙個串的時候,即21 1,22 16 4...