1. 程式人生 > >AC自動機——多模式串的匹配

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樹,可以較好的利用模式串的