AC自動機的一點理解

2022-05-20 20:17:15 字數 692 閱讀 9308

\(fail\)指標:指向最長的在\(tire\)裡出現的字尾

比\(tire\)多出來的子邊:原來的\(tire\),我們失配後又得返回根結點再次匹配,而加入這些邊後只需要花\(strlen(s)\)就能實現所有匹配

跑\(tire\)圖:能跑到乙個結點,該結點所代表的串能被文字串表示

問題1:多個模式串,乙個文字串,有幾個模式串出現在文字串內

做法:對於多個模式串建自動機,文字串匹配,匹配到的點及\(fail\)點的代表的串都在文字串中

具體操作+優化:我們對於每個串的末端點\(val_i\)都記錄代表幾個串(建\(trie\)),在\(trie\)圖中不變,然後每次匹配到的點往上爬並累加\(val\)值並標記,

之後再爬的時候到過標記了的點就退出,則保證了時間複雜度

問題2:多個模式串,乙個文字串,求每個模式串出現的次數

做法:對於多個模式串建自動機,文字串匹配,匹配到的點及\(fail\)點的代表的串都在文字串中,並讓這些串次數都+1

具體操作+優化:第一題我們用標記保證了時間複雜度,可這題需要得求每個串出現的次數,標記一下以後就找不到了怎麼辦?

先把文字串匹配一下,經過的點記錄值,然後用topsort來處理,按相當於鍵fail樹從葉子節點往上傳,這樣就能得到每個點代表的串出現的次數

最後再比較一下每個串的末節點出現的次數

AC自動機理解

對於ac自動機可能有的疑問。首先上 該 使用char型陣列儲存,事實上string也完全可以。includeusing namespace std char s 1000005 struct tree 字典樹 ac 1000000 trie樹 int cnt 0 trie的指標 inline voi...

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

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

AC自動機及字尾自動機

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