敏感詞遮蔽 AC自動機

2021-10-05 06:05:36 字數 1362 閱讀 2584

上一周我們講了trie樹,這次的ac自動機是trie樹的乙個改進版,也是乙個多模式串匹配演算法。

ac自動機——找尋符合條件的字尾。

1、首先我們構建乙個如圖的trie樹

如下圖

2、在學習kmp演算法的時候,我們說到了好字首的字首子串和字尾子串匹配。

在trie樹中,我們借鑑這個思路,如果出現了不匹配字元,我們就去trie樹中找「可匹配的最長字尾」。

在kmp演算法中,我們又next陣列,在trie樹中,我們用」失敗指標「。

如下圖

ac自動機的關鍵在於兩個部分。1、構建trie樹。2、構建失敗指標

#include #include #include #include #include using namespace std;

typedef struct _acnode

;//此處我假設只有26個小寫字母

struct _acnode* fail = nullptr;

bool isending = false;

int index = 0;

}acnode;

class acautomachine

void createtrie(string src)

else

}curpoint->isending = true;

} void buildfailpoint()

else

else if (qc == 0&&q == root)

q = q->fail;

}if (q == nullptr)

}acnodequeue.push(pc);

}} }

void match(string src)

p = p->children[index];

//沒有匹配的從root開始,

if (p == nullptr)

p = root;

acnode* tmp = p;

while (tmp != root)

tmp = tmp->fail;

}} }

private:

acnode* root;

};int main()

列印結果

index0 length = 3

index1 length = 2

請按任意鍵繼續. . .

AC自動機 建立nlogn個AC自動機

string set queries 題意 給你3種操作,1 加入乙個串到集合中。2 刪除集合中的某乙個串 3 查詢集合中的字串在給定的字串種出現幾次。同乙個串可重複 解法 建立多個ac自動機,用二進位制分組來處理。加入給你21個串 分為 16 4 1,再新增乙個串的時候,即21 1,22 16 4...

AC自動機 搜尋關鍵詞

給定 n 個長度不超過 50 的由小寫英文本母組成的單詞,以及一篇長為 m 的文章。請問,有多少個單詞在文章 現了。輸入格式 第一行包含整數 t,表示共有 t 組測試資料。對於每組資料,第一行乙個整數 n,接下去 n 行表示 n 個單詞,最後一行輸入乙個字串,表示文章。輸出格式 對於每組資料,輸出乙...

AC自動機及字尾自動機

ac自動機是一種基於trie樹的演算法,其本質和kmp上的處理很相似。trie樹結構 kmp轉移思路 ac自動機組要由三個部分組成 trie樹的建立 fail指標的匹配 對ac自動機的詢問 每次建立自動機會有一次初始化 ac自動機類 struct node node結構體 struct ac voi...