ac自動機:解決多個模式串匹配乙個主串的問題
演算法思想:
1、把模式串建trie樹,然後用類似於kmp的思想,來構建fail邊,實現已匹配的字尾當其他模式串的字首。具體fail邊的構建可以看這些文章:
2、壓縮下路徑,類似於並查集的路徑壓縮。具體見**。
理解方法:畫圖自己多模擬幾遍
模板題:(但都是暴力跳fail,會有嗯卡的題,因為你跳fail的時候會有重複,比如這個模板題:洛谷5357,但好像要樹上差分什麼的555還不會呢,所以以後遇到了再說吧)
洛谷3808:n個模式串,1個主串,求有多少個不同的模式串在文字串裡出現過(編號不同就不同)
**:
#include using namespace std;
const int maxn=1e6+10;
struct nodeac[maxn];
int tot=0;
void insert(char *s)
} while(!q.empty())
//trie下一層有這個字元,則把下一層這個結點的失配指標連到當前結點的失配指標指向的結點下一層對應這個字元的結點
//同時入隊
ac[ac[p].vis[i]].fail=ac[ac[p].fail].vis[i];
q.push(ac[p].vis[i]);
} }}
int ac_ask(char *s)
ac[maxn];
int tot=0;
int mx=0;
int n;
char s[155][75];
char t[maxn];
struct ansans[155];
int cmp(ans &n1,ans &n2)
} while(!q.empty())
ac[ac[p].vis[i]].fail=ac[ac[p].fail].vis[i];
q.push(ac[p].vis[i]);
} }}
void ac_ask(char *s)
} }void init()
for(int i=1;i<=n;i++) ans[i].pos=i,ans[i].num=0;
mx=0;
} int main()
get_fail();
scanf("%s",t);
ac_ask(t);
sort(ans+1,ans+n+1,cmp);
printf("%d\n",mx);
for(int i=1;i<=n;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自動機的理論,思想。首先我們必須要明確乙...