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

2021-10-09 03:14:02 字數 3581 閱讀 4411

虛線部分代表fail指標

ac自動機模板題鏈結

靜態陣列版本(推薦:**量少易寫,更快易寫):

#include

using

namespace std;

class

aho_corasick

/*儲存結構:trie樹*/

void

insert

(const

char

* str)

cnt[p]++;

}void

build_fail()

while

(!q.

empty()

)}}}

intquery

(const

char

* str)

else

break

;/*寫法2:

ans += cnt[temp];

cnt[temp] = 0;*/

tmp = fail[tmp];}

}return ans;

}private

:static

const

int childcnt =26;

static

const

int n =

500005

;int son[n]

[childcnt]

, cnt[n]

, idx;

// 0既是root又是null

int fail[n];}

;const

int maxn =

1e7+5;

char key[70]

;char pattern[maxn]

;int n;

aho_corasick ac;

intmain()

scanf

("%s"

, pattern)

; ac.

build_fail()

;printf

("%d\n"

, ac.

query

(pattern));

}return0;

}

指標優化版本:

#include

using

namespace std;

class

aho_corasick

/*儲存結構:trie樹*/

void

insert

(const

char

* word)

tmp-

>sum++;}

void

build_fail()

root-

>child[i]

->fail = root;

q.push

(root-

>child[i]);

}while

(!q.

empty()

)/*和靜態陣列版本相似補邊,狀態壓縮*/

else cur-

>child[i]

= cur-

>fail-

>child[i];}

}}intquery

(char

* ch)

else

break

;/*另一寫法

ans += tmp->sum;

tmp->sum = 0;*/

tmp = tmp-

>fail;}}

return ans;

}private

:static

const

int childcnt =26;

struct node }

; node* root;};

const

int maxn =

1e7+5;

char key[70]

;char pattern[maxn]

;int n;

intmain()

scanf

("%s"

, pattern)

; ac.

build_fail()

;printf

("%d\n"

, ac.

query

(pattern));

}return0;

}

指標無優化版本:

#include

using

namespace std;

class

aho_corasick

/*儲存結構:trie樹*/

void

insert

(const

char

* word)

tmp-

>sum++;}

void

build_fail()

/*fail指標構建規則:首先在fathe***il指標尋找當前字元是否存在

如果不存在則繼續跳fail指標直到直到該字元或者fathe***il為空

如果fathe***il最後為空則設定當前節點的fail為root

否則就設定為fathe***il->child[i]*/

while

(!q.

empty()

) p = p-

>fail;}if

(!p) cur-

>child[i]

->fail = root;

q.push

(cur-

>child[i]);

}}}}

intquery

(char

* ch)

else

break

;/*另一寫法

ans += tmp->sum;

tmp->sum = 0;*/

tmp = tmp-

>fail;}}

return ans;

}private

:static

const

int childcnt =26;

struct node }

; node* root;};

const

int maxn =

1e7+5;

char key[70]

;char pattern[maxn]

;int n;

intmain()

scanf

("%s"

, pattern)

; ac.

build_fail()

;printf

("%d\n"

, ac.

query

(pattern));

}return0;

}

AC 自動機 多模式串匹配

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

AC自動機(多模式匹配)

ac自動機主要解決的問題 多模式匹配 kmp則屬於單模式匹配 n個單詞在m個字元的文章中,出現過多少次。主要分三步 構建trie樹 構建失敗指標 尋找匹配個數 trie樹 又稱字典樹 單詞查詢樹,是一種樹形結構,用於儲存大量的字串。它的優點是 利用字串的公共字首來節約儲存空間。具體參見 失敗指標 作...

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

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