AC自動機詳解

2021-07-28 00:21:08 字數 1452 閱讀 6459

最近真是太頹了,做了一堆板子題,現在對一些知識點順便來個總結記錄

大家應該都知道kmp和trie樹吧,不懂的可以看我部落格或到網上自己動手尋找資料。ac自動機是乙個很好的東西,這是因為它的名字很好它能夠在有多個模式串的時候進行全文匹配,這十分方便地擴充套件了kmp的功能,實際上它的思路與原理與kmp十分地類似

首先,和kmp一樣,我們要把根節點和根的兒子節點們的fa

il函式都賦值為0,然後,我們考慮在trie樹上進行bfs,同時像kmp一樣,不斷地向前推,同時還要處理乙個la

st陣列,用於儲存每個節點沿失配邊走所遇到的第乙個單詞節點,因為我們在找到乙個模式串的時候,也許還會有許多其他的模式串也被匹配了,所以我們要不斷地再沿著la

st走即可

#include

#include

#include

#include

#include

#define maxn 105

#define maxn1 1000005

#define maxn2 100005

#define sigma_size 26

using

namespace

std;

char txt[maxn1],tmp[maxn2];

int len1,n,size=1,f[maxn1],last[maxn1],ans=0;

bool vis[maxn];

//struct trie

int idx(char c)

void insert(char* s,int v)

u=ch[u][c];

}val[u]=v;

}//};

void init()

while(!bfs.empty())

bfs.push(u);

int v=f[r];

while(v&&!ch[v][i])v=f[v];

f[u]=ch[v][i];

last[u]=val[f[u]]?f[u]:last[f[u]];}}

}void accumulate(int x)

return;

}void ac_am()

return;

}int main()

ac_am();

for(int i=1;i<=n;i++)

printf("%d",ans);

return

0;}

大概就是這樣

我們可以進行一些小小的優化,比如我們可以把不存在的節點連線回存在的節點,即讓它自動沿著fa

il走,這樣其實非常方便

在ac自動機上,或者說是在trie樹上,我們所謂的失配,就從kmp中的節點不匹配變化為了節點不存在,所以我們每次只要把

σ (字母表)中的元素都列舉一遍即可

沒寫的時候感覺很難,寫完了以後其實也挺難,但實際上並不難

AC自動機詳解

首先,ac自動機,不是 自動accepted機,這是乙個多模字串匹配演算法,學習這個演算法,首先要熟悉kmp演算法這個單模字串匹配演算法,然後,我們知道有個高效的多模字串匹配演算法,叫字典樹,它處理的是一些單詞在乙個句子裡出現了幾次,但假如不是在乙個句子裡,而是在乙個字串裡呢?那它就顯得很弱了,所以...

AC自動機詳解

include include include include include include include include using namespace std typedef long long ll const int maxn 2 1e6 9 int trie maxn 26 字典樹 i...

AC自動機詳解

首先,看清楚了,這是ac自動機不是自動ac機 引用ac自動機模板題上的一句話 ovo在學習ac自動機之前,應該先掌握一下兩個前置技能 ac自動機,通俗地講,就是在trie上跑kmp。ac自動機利用trie的性質和kmp的思想,可以實現字串的多模匹配。kmp是單模匹配,而它與ac自動機最大的區別就在f...