最近真是太頹了,做了一堆板子題,現在對一些知識點順便來個總結記錄
大家應該都知道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...