上一周我們講了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...