AC自动机(Aho-Corasick Automata)是经典的多模式匹配算法。从前我学过这个算法,但理解的不深刻,现在已经十分不明了了。现在发觉自己对大部分算法的掌握都有问题,决定重写一系列博客把学过的算法review一下,目标是:

  • 充分理解算法的原理与实现细节
  • 形成一个简洁明了,能很好反映原理的写法,作为模板

Codeforces上讲解AC自动机的一篇博客

Wikipedia  词条Aho–Corasick algorithm

Overview

Concepts

  • finite state machine
  • prefix, suffix, proper (strict) suffix/prefix
  • dictionary
  • trie
  • trie graph (alias of A-C automata)
  • child arc
  • suffix arc (link)
  • dictionary (dict.) suffix arc (link)

Backgroud

AC自动机是KMP算法的推广. 这里有必要指出:字符串是trie的一个特例,或者更进一步说,序列是有根树的一个特例。

trie属于有根树,trie是一个字符串的集合,它的节点表示一个字符串,边表示一个字符。

我们把模式串的集合$P:\{p\}$插入到一个trie中,然后对每个节点$u$,计算其失配函数$fail[u]$。

失配函数

我们来定义失配函数。形式化地讲,失配函数是一个从字符串到字符串的映射

fail(s)= ... (留坑待填)

Implementation

int build_ac(){
    , tail=;
    // note: the one-character string is the boundary conditon, not the empty string which is the singularity instead.

    ; i<; i++){
        ][i]) que[tail++]=ch[][i];
    }

    for(int u; head!=tail; ){
        u=que[head++];
        ; i<; i++){
            int &v=ch[u][i];
            if(v){
                que[tail++]=v;
                // loop invariant: j is a critical prefix of u
                for(int j=f[u]; j && !ch[j][i]; j=f[j]);
                f[v]=ch[j][i];
                last[v] = val[f[v]]?f[v]:last[f[v]];
             }
        }
    }
}

AC 自动机的更多相关文章

  1. 基于trie树做一个ac自动机

    基于trie树做一个ac自动机 #!/usr/bin/python # -*- coding: utf-8 -*- class Node: def __init__(self): self.value ...

  2. AC自动机-算法详解

    What's Aho-Corasick automaton? 一种多模式串匹配算法,该算法在1975年产生于贝尔实验室,是著名的多模式匹配算法之一. 简单的说,KMP用来在一篇文章中匹配一个模式串:但 ...

  3. python爬虫学习(11) —— 也写个AC自动机

    0. 写在前面 本文记录了一个AC自动机的诞生! 之前看过有人用C++写过AC自动机,也有用C#写的,还有一个用nodejs写的.. C# 逆袭--自制日刷千题的AC自动机攻克HDU OJ HDU 自 ...

  4. BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]

    2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 2545  Solved: 1419[Submit][Sta ...

  5. BZOJ 3172: [Tjoi2013]单词 [AC自动机 Fail树]

    3172: [Tjoi2013]单词 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 3198  Solved: 1532[Submit][Status ...

  6. BZOJ 1212: [HNOI2004]L语言 [AC自动机 DP]

    1212: [HNOI2004]L语言 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1367  Solved: 598[Submit][Status ...

  7. [AC自动机]【学习笔记】

    Keywords Search Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)To ...

  8. AC自动机 HDU 3065

    大概就是裸的AC自动机了 #include<stdio.h> #include<algorithm> #include<string.h> #include< ...

  9. AC自动机 HDU 2896

    n个字串 m个母串 字串在母串中出现几次 #include<stdio.h> #include<algorithm> #include<string.h> #inc ...

  10. 【BZOJ-3881】Divljak AC自动机fail树 + 树链剖分+ 树状数组 + DFS序

    3881: [Coci2015]Divljak Time Limit: 20 Sec  Memory Limit: 768 MBSubmit: 508  Solved: 158[Submit][Sta ...

随机推荐

  1. c# 调用win32模拟点击的两种方法

    第一种 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; ...

  2. 利用CSS预处理技术实现项目换肤功能(less css + asp.net mvc4.0 bundle)

    一.背景 在越来越重视用户体验的今天,换肤功能也慢慢被重视起来.一个web系统用户可以选择一个自己喜欢的系统主题,在用户眼里还是会多少加点分的.我们很开心的是easyui v1.3.4有自带defau ...

  3. Android编译报Errors running builder 'Android Pre Compiler' on project 'XXX' java.lang.NullPointerException

    编译android时,遇到报错:Errors occurred during the build.Errors running builder 'Android Pre Compiler' on pr ...

  4. keypress,keydown,keyup,charCode,keyCode兼容性问题

    keypress对应的是字符编码,如“ABC”,“123”之类,有大小写之分(有兼容性问题) keydown,keyup对应的是键盘的键码,无大小写之分,每个键盘都有一个键码(无兼容性问题) 使用ke ...

  5. java中的全等和相似

    package pack2; import java.util.*; /*Node 的equals()和hashCode()两个函数缺一不可 * HashSet会通过这两个函数来判断两个元素是否等价 ...

  6. UTF-8 's format

    几篇比较好的博客 古腾龙的博客:编码规则(UTF-8 GBK) GBK 千千秀字 shell set man ascii可以查看ascii码表,man utf-8看以查看utf-8的帮助 Unicod ...

  7. killall 根据名称终止进程

    根据名称终止进程 killall [option] name-list killall 将信号发送到一个或多个进程用来终止它.除超级用户外,只有进程的所有者才可以对进程执行killall,超级用户可以 ...

  8. 【BZOJ 4547】【HDU 5157】小奇的集合

    http://www.lydsy.com/JudgeOnline/problem.php?id=4547 本蒟蒻并不会矩乘求Fibonacci数列前缀和,所以果断分块打表,常数竟然比矩乘要小! PS: ...

  9. 【BZOJ 4598】【SDOI 2016 Round2 Day1 T3】模式字符串

    2016-05-21因为BZOJ上“ 数据文件太过巨大,仅提供前三组数据测试.”所以我考场上写的60分的点分治交上去也A了. 我的这个点分治的时间复杂度是$O(Tnmlogn)$的,听题解时没听懂$O ...

  10. 【NOIP 2004】虫食算

    因为一天机房都是断网状态,校内的小V评测这道题总显示Unaccept,所以下午放学后就和xiaoyimi晚上回家自习,来做一做这道题. 搜索+剪枝优化: 一开始我是顺着低位向高位填数,这么暴力在Vij ...