AC自動機(多模式匹配)

2021-06-08 05:57:07 字數 863 閱讀 8441

ac自動機主要解決的問題:多模式匹配(kmp則屬於單模式匹配),n個單詞在m個字元的文章中,出現過多少次。

主要分三步:構建trie樹、構建失敗指標、尋找匹配個數

trie樹:又稱字典樹、單詞查詢樹,是一種樹形結構,用於儲存大量的字串。它的優點是:利用字串的公共字首來節約儲存空間。

具體參見:

失敗指標:作用於kmp的next類似,但存在實際不同,對於字串s[nmax],k = next[i],並不要求s[i] = s[k],只需要前面k - 1個字母相同即可。而失敗節點既要求兩個節點相同,也要求前面的k - 1個節點相同。這是與next作用的區別。

需要用到的資料結構:

struct node

}*queue[nmax];

char keyword[mmax];

char str[nmax];

int ans;

演算法模板:

void insert(char s, node *root)

//構建tire樹,這裡沒什麼可解釋,一次歷遍即可

p ->count ++;

}void buildfailnode(node *root)

//構建失敗指標,佇列實現

fa = fa->fail;

}if(fa == null) p->next[i]->fail = root;

queue[front ++] = p->next[i];

}} }

}void match(node *root)

//尋找一串字元中,共有多少能與關鍵字匹配。

}}

詳細參見,**並茂:

AC 自動機 多模式串匹配

上的敏感詞過濾是怎麼實現的呢?實際上,這些功能最基本的原理就是字串匹配演算法,也就是通過維護乙個敏感詞的字典,當使用者輸入一段文字內容後,通過字串匹配演算法來檢查使用者輸入的內容是否包含敏感詞。bf rk bm kmp 演算法都是針對只有乙個模式串的字串匹配演算法,而要實現乙個高效能的敏感詞過濾系統...

AC自動機(多模式串匹配)

虛線部分代表fail指標 ac自動機模板題鏈結 靜態陣列版本 推薦 量少易寫,更快易寫 include using namespace std class aho corasick 儲存結構 trie樹 void insert const char str cnt p void build fail...

ac自動機 匹配最長字首 多模匹配 AC自動機

精確的字串匹配演算法有 單模匹配演算法,比如,kmp bm演算法等 和 多模匹配演算法,比如,wu manber ac演算法等。ac演算法 aho corasick 是kmp演算法向多模式串情形的擴充套件,該演算法使用一種特殊的自動機,即ac自動機。ac自動機由一組模式串p生成,是trie的擴充套件...