AC自動機學習筆記

2022-05-11 13:25:08 字數 1421 閱讀 4300

這裡給三個板子做乙個總結

簡單版ac自動機就是kmp+trie,fail指標在多模式串之間跳躍來進行匹配。

fail指標有一種很妙的寫法:

inline void bfs()

}}

把一棵樹補成一張圖,拿來更好地匹配。

**實現:

#include#include#include#includeusing namespace std;

int n,m,k,x,y,z,cnt,ans,now,nows;

char s[1000039],a[1000039];

struct treef[1000039];

inline void get()

f[now].cnt++;

}queueq;

inline void bfs()

while(!q.empty())

else f[nows].son[i]=f[f[nows].fail].son[i];

} }}inline int check()

now=f[now].son[s[i]-'a'];

} return ans;

}int main()

加強版

這個可以匹配到以後暴力跳fail指標,給沿線每個指標加上\(1\)

這樣的複雜度是\(o(70|s|+\sum\limits)\)

然而這個\(70\)可以消掉,注意我們暴力跳了很多無用的路徑,所以可以把這些放到最後弄。一遍拓撲就好了。時間複雜度\(o(|s|+\sum\limits)\)常數略大。

其實二次加強版是一樣的,就不贅述了。

**實現:

#include#include#includeusing namespace std;

int n,m,k,x,y,z,ans[200039],t,cnt,id[200039],in[200039],pus,now;

struct acf[200039];

char s[200039],a[2000039];

inline void get(int x)

queueq;

inline void bfs() }}

inline void find()

int main()bfs();

scanf("%s",a+1);m=strlen(a+1);find();

for(i=1;i<=cnt;i++)in[f[i].fail]++,ans[i]=f[i].tot;

for(i=1;i<=cnt;i++)if(!in[i]) q.push(i);

while(!q.empty())

for(i=1;i<=n;i++) printf("%d\n",ans[id[i]]);

}

AC自動機 學習筆記

是一種數學模型,大概就是由一堆狀態和狀態轉移規則等東西構成,能與外界交換資訊,並改變動作。這個是理論上的東西,了解就行,對ac自動機的理解沒有大影響。通俗的講就是在trie上做kmp,處理多模式串匹配問題。trie 的每個結點就是乙個狀態,根結點是初始狀態。ac自動機的行為被定義為一下3個函式 1....

AC自動機學習筆記

ac自動機是基於字典樹和fail指標來快速一類解決多串匹配的問題。先用所有模式串建乙個字典樹。然後用bfs搞出每個節點的fail指標。fail指標是指向 和當前 字首的字尾有最長匹配的字首。洛谷3808 掃文字串的時候,標記一下訪問過的字典樹上的節點。include using namespace ...

AC自動機學習筆記

title ac自動機學習筆記 date 2020 08 31 15 53 40 tags 8月的最後一天,還是完成了ac自動機的學習。在熟練掌握了kmp後,我發現ac自動機並沒有想象的那麼難,既不難理解,也不難實現,於是決定寫點東西記錄一下。本篇主要談談ac自動機的理論,思想。首先我們必須要明確乙...