AC自動機講解

2022-05-08 01:15:05 字數 1298 閱讀 4976

首先,作為作者的我一定知道你已經會了這兩個演算法:kmp與trie樹,如若不會,可以先學習一下。

我在這裡宣告一下ac自動機不是自動ac的演算法,其全稱是aho-corasick automaton,是一種著名的多模匹配演算法。其實現類似於trie樹與kmp演算法的結合,是將多個模式串放在trie樹上做出fail指標,並用文字串進行匹配。整個演算法共分為三個部分:1) 建trie樹 2) 匹配fail指標 3) 運用並求出答案。下面我會講解前兩個步驟。

相信學過trie樹的oier都會,就是簡單的動態開點,如果當前節點的出邊有下乙個字元,則直接走下去,否則我們可以新開乙個節點,再走下去,是不是和動態開點線段樹思想一樣?**也比較好實現,在這裡我以都是小寫英文本母為例。

#define n 1000001

char str;int root,cnt;

struct node

node[n];        //每乙個結構體都是乙個節點,son陣列是當前節點的兒子們

void build(int now,int p)

int main()

這是整個演算法的核心部分,也是我要重點講解的部分,我們看一下下面左面的,這是一棵已經建好的trie樹,分別是五個模式串所建成的trie樹(五個模式串為:aaa、abc、bcd、cab、cad),我們就要用這個簡單的trie樹來學習什麼是fail指標。首先我們要弄明白fail指標的定義,ac自動機的fail指標和kmp中的fail指標大致相同,但是還是有一定的區別的,這裡的fail指標指向的是乙個字串中的乙個點,並且當前字串的字尾與以指向的點為結尾的字尾相同的長度最長,見下面右圖中,已經給出例子來了,理解一下定義。

那麼它是怎麼匹配出來的呢?我們發現每乙個點的fail指標都是指向上面,即層數小於自己的點,所以我們不能用dfs來更新,應該用bfs這種優秀的演算法,這樣我們每一次更新點的時候,都能用已經更新好點,我們再看一看圖,發現當前點的fail的兒子與自己的兒子有相同時,自己的兒子的fail就是自己的fail的兒子,圖中有不只一組滿足這個性質,根據這個性質,我們尋找fail指標就容易多了。下面就是**部分了。

void find_fail()

else node[p].son[i]=node[node[p].fail].son[i];}}

}

在這裡,我用的是系統之中的佇列,如果有興趣手寫的話,可以手寫,我不攔著。

AC自動機講解

飄過的小牛 ac自動機簡介 首先簡要介紹一下ac自動機 aho corasick automation,該演算法在1975年產生於貝爾實驗室,是著名的多模匹配演算法之一。乙個常見的例子就是給出n個單詞,再給出一段包含m個字元的文章,讓你找出有多少個單詞在文章裡出現過。要搞懂ac自動機,先得有字典樹t...

AC自動機 講解 模板

首先 先給你q 個查詢串 再給你乙個主串s 或者很多個不同主串 q個查詢串 有幾個 在主串裡 匹配成功了 可以記個cnt統計 查詢串不重複,重複的要計算數量的話,要加個sum記錄 重複查詢串 出現了幾次 還可以知道 匹配成功 的查詢串是哪些 偷懶還用 sum標 它是第幾個查詢串 字典樹就不用說了吧,...

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

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