AC自動機初探

2021-09-24 15:19:14 字數 1439 閱讀 2717

ac自動機是kmp

kmpkm

p和trie

trie

trie

的結合,它處理了單串匹配多模式串的問題。

之所以這麼因為它引入了fai

lfail

fail

指標處理相同字尾的資訊,利用tri

etrie

trie

處理多模式串的問題。

從trie的0結點開始往外延伸,對於每個結點都有自己的指標指向自己的字尾。

字尾一定是小於自己的長度的,所以字尾的字尾事先應該是處理好的。

先把所有模式串插入,再求fail指標,由於上述的性質,我們求解的時候可以用bfs去擴充套件。

在最後處理的時候,每次匹配到需要同時處理字尾,匹配不到,就一直跳字尾fail直到跳到下乙個可以匹配的地方,最終是指向開頭0的。

我們可以進行兩處優化:

trie圖優化:

每次處理到不能匹配的時候,我們可以直接令其指向其字尾的下乙個此結點,如果還是不可以的話,字尾肯定是先處理過的,所以可以以線性方式指回去。類似於並查集的那種路徑壓縮方式。

last優化:

每次處理這個點匹配不到過後指向的單詞結點,而不是乙個乙個去看是否是單詞結點。處理方式就是:

對於這個結點直接跳到自己字尾的last指標,自然是個遞迴過程,前面的一定是求出來的。

理解了這些還是很簡單的。

**:

const

int maxn =

2000050

;const

int sigma_size =26;

char ss[maxn]

,tt[maxn]

;int num[

100050];

struct acauto

intidx

(char c)

void

insert

(char

*s,int x)

u=ch[u]

[c];}if

(!val[u]

)num[x]

=val[u]

=x;else num[x]

=val[u];}

void

slove

(int x)

}void

getfail()

}while

(!q.

empty()

) q.

push

(u);

f[u]

=ch[f[r]

][c]

; last[u]

=val[f[u]

]?f[u]

:last[f[u]];

}}}void

query

(char

*t)}

}ac;

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...

AC自動機演算法

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