AC自動機——多模式串的匹配
描述
AC自動機主要用於解決多模式串的匹配問題,是字典樹(trie樹)的變種,一種偽樹形結構(有向圖)。
trie圖是對AC自動機的一種改造,使得圖中每個結點都有字符集個數條出邊。
trie圖上的每個結點代表一個狀態,每條邊代表一個字元。
模版
struct acAutoMachine{
int cnt, son[MAXN][MAXC], fail[MAXN], dfa[MAXN][MAXN];
int list[MAXN], head, tail;
bool over[MAXN], isnode[MAXN][MAXC];
void insert(){
int p = root, k;
for (int i = 0; i < len; i++){
k = s[i]-'a';
if (!son[p][k]) son[p][k] = ++cnt, isnode[p][k] = 1;
p = son[p][k];
}
over[p] = 1;
}
void calcFail(){
list[head = 0] = root, tail = 1, fail[root] = -1;
int now, k, tmp;
while (head != tail){
now = list[head++], over[now] |= (now == root) ? 0 : over[fail[now]];
for (int i = 0; i < MAXC; i++){
k = son[now][i];
tmp = (now == root) ? root : son[fail[now]][i];
if (k) list[tail++] = k,fail[k] = tmp;
else son[now][i] = tmp;
}
}
}
};
相關推薦
AC 自動機——多模式串匹配
網站上的敏感詞過濾是怎麼實現的呢? 實際上,這些功能最基本的原理就是字串匹配演算法,也就是通過維護一個敏感詞的字典,當用戶輸入一段文字內容後,通過字串匹配演算法來檢查使用者輸入的內容是否包含敏感詞。 BF、RK、BM、KMP 演算法都是針對只有一個模式串的字串匹配演算法,而要實現一個高效能的敏感
AC自動機——多模式串的匹配
描述 具體看這裡 AC自動機主要用於解決多模式串的匹配問題,是字典樹(trie樹)的變種,一種偽樹形結構(有向圖)。 trie圖是對AC自動機的一種改造,使得圖中每個結點都有字符集個數條出
【轉載】多模式串匹配之AC自動機
content 2.4 n) ptr float char toggle msg align 原文地址:https://www.cnblogs.com/codeape/p/3845375.html
18.10.29 多模式串字符串匹配模板題~AC自動機
輸入 queue prev pac 輸出 spl 串匹配 opened ++ 描述 給若幹個模式串,以及若幹個句子,判斷每個句子裏是否包含模式串。 句子和模式串都由小寫字母組成 輸入第一行是整數n,表示有n個模式串 ( n <= 1000)接下來n行每行一個模式串
多模式串字串匹配模板題
總時間限制: 1000ms 記憶體限制: 65536kB 描述 給若干個模式串,以及若干個句子,判斷每個句子裡是否包含模式串。 句子和模式串都由小寫字母組成 輸入 第一行是
簡單講解KMP單模式匹配與AC演算法多模式匹配(KMP篇)
前言 本篇是對於KMP單模式匹配以及AC演算法多模式匹配的簡單講解,KMP演算法與AC演算法是關鍵字檢索中的常見演算法,能夠快速而高效地查找出目標字串中的多個關鍵字的匹配情況,而要檢索的關鍵字通常被稱為模式串,因此模式匹配四個字也就好理解了。網上的很多對於KMP的講解總是結
多模式串的匹配運用 --- HDU 3065
// Memory Time// 1347K 0MS// by : Snarl_jsb// 2014-09-30-21.00#include<algorithm>#include<cstdio>#include<cstring>#include<cstdl
SPOJ LCS2 - Longest Common Substring II 後綴自動機 多個串的LCS
plus namespace sub align call 節點 inline cto res LCS2 - Longest Common Substring II no tags A string is finite sequence of cha
KMP——單模式串匹配演算法 模板
直接上程式碼,註釋很清晰 #include<bits/stdc++.h> using namespace std; const int MAXN=1000010; int kmp[MAXN]; int la,lb,j; char a[MAXN],b[MAXN]; int
ACM-字串-模式串匹配-KMP演算法
在模式匹配演算法中,KMP是比較常見的單模、高效率演算法之一。在討論KMP之前,先看看樸素的匹配演算法為什麼低效。普通的暴力匹配演算法在每一次匹配失敗之後,僅僅下移一位,並且需要重新判斷整個模式串的每一個字元,見下圖: 第一次匹配時,首先會遍歷模式串的每一個字元,但是發現
【Codeforces】528D. Fuzzy Search-FFT&模式串匹配
傳送門:cf528D 題解 按照模式串匹配套路,不妨設 S i
模式串匹配之KMP演算法詳解
KMP演算法,是由Knuth,Morris,Pratt共同提出的模式匹配演算法,其對於任何模式和目標序列,都可以線上性時間內完成匹配查詢,而不會發生退化,是一個非常優秀的模式匹配演算法。但是相較於其他模式匹配演算法,該演算法晦澀難懂,第一次接觸該演算法的讀者往往會看得一頭
Aho-Corasick 多模式匹配算法、AC自動機詳解
實現 輸出 dfa 輸入 開始 img 添加 每一個 jpg Aho-Corasick算法是多模式匹配中的經典算法,目前在實際應用中較多。 Aho-Corasick算法對應的數據結構是Aho-Corasick自動機,簡稱AC自動機。 搞編程的一般都應該知道自動機FA吧,具體
hdu3065 病毒侵襲持續中 AC自動機入門題 N(N <= 1000)個長度不大於50的模式串(保證所有的模式串都不相同), 一個長度不大於2000000的待匹配串,求模式串在待匹配串中的出現次數。
sizeof archive 模式 emp tomat .... truct print sca /** 題目:hdu3065 病毒侵襲持續中 鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=3065 題意:N(N <= 1
HDU2222 多串匹配 (AC自動機)
AC自動機簡介: 首先簡要介紹一下AC自動機:Aho-Corasick automation,該演算法在1975年產生於貝爾實驗室,是著名的多模匹配演算法之一。一個常見的例子就是給出n個單詞,再給出一段包含m個字元的文章,讓你找出有多少個單詞在文章裡出現過。要搞懂AC
多模式匹配演算法:AC自動機的C++實現
AC自動機(Aho-Corasick automaton)是用來處理多模式匹配問題的。 基本可認為是TrieTree+KMP。其中KMP是一種單模式匹配演算法。 AC自動機的構造要點是失敗指標的設定,用於匹配失敗時跳轉到另一節點繼續匹配。同時在匹配的過程中也用來檢索其他“同
UVALive-4670 AC自動機入門題 求出現次數最多的子串
efi con sig http ati code fine mod long /** 鏈接:http://vjudge.net/problem/UVALive-4670 詳見lrj訓練指南P216 */ #include<bits/stdc++.h> usi
【模板】AC自動機(多少個模式串在文字串裡出現過)
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<queue> #include<
多模字串匹配演算法之AC自動機—原理與實現
簡介: 本文是博主自身對AC自動機的原理的一些理解和看法,主要以舉例的方式講解,同時又配以相應的圖片。程式碼實現部分也予以明確的註釋,希望給大家不一樣的感受。AC自動機主要用於多模式字串的匹配,本質上是KMP演算法的樹形擴充套件。這篇文章主要介紹AC自動機的工作原理,並在此
[Alg] 文字匹配-多模匹配-AC自動機
1. 簡介 AC自動機是一種多模匹配的文字匹配演算法。 如果採用naive的方法,即依次比較文字串s中是否包含模式串p1, p2,...非常耗時。考慮到這些模式串中可能具有相同子串,可以利用已經比較過的那些模式串的一些資訊,來優化效率。容易想到的一種方法是為這些模式串構建一個trie樹,可以較好的利用模式串的