1. 程式人生 > >AC自動機小結

AC自動機小結

打字 總結 獲取 前綴 前插 trie oot ref style

總結一下自己的心得體會,不講算法。。

AC自動機

AC自動機即Trie+KMP?是解決多模式串匹配的一種算法

它的構造方式如下:

  1. 將模式串全部插入Trie樹種
  2. 獲取Trie樹的fail指針
  3. 枚舉模式串在Trie樹上進行匹配

註意:在一般的匹配問題中,我們會把trie樹補為trie圖,雖然這樣會極大的降低匹配時間,但是當利用的$fail$樹中各節點相對位置(例如lca)的時候不建議這麽做

性質

如無特殊說明,$x$表示從$root$到$x$節點形成的字符串

1.$x$的$fail$指針指向的$y$為模式串中在$x$之前插入的串中與$x$有著最長公共後綴的前綴

2.$x$在$y$中出現的此處為$y$的路徑中,$fail$指針指向$x$的節點的數量

BZOJ2434: [Noi2011]阿貍的打字機

洛谷P3966 [TJOI2013]單詞

3.點$x$與點$y$在$fail$樹中$lca$處的到的字符串,為模式串中與$x,y$公共後綴最長的前綴

BZOJ2746: [HEOI2012]旅行問題

AC自動機還經常與dp結合食用,套路一般為$f[i][j]$表示當前長度為$i$,在AC自動機上第$j$號節點時的答案,轉移的時候枚舉出邊

時間復雜度

Tire樹暴跳fail的復雜度為$O(max(L(P_i))L(T))$其中L串的長度函數,P是模式串,T是目標串。

比如模式串為$aaaaaaaaaaaaaaaaaaaaa$

Trie圖的時間復雜性為:$O(L(T))$

對於構造的代價是$O(sum(L(P_i)))$其中sum是求和函數。

AC自動機小結