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的擴充套件...