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. MD5算法的C语言实现

    1 #include <stdio.h> #include <stdint.h> #include <stdlib.h> #include <string.h ...

  2. Groovy与Gradle在Android中的应用

    大家都知道, Android Studio 的编译构建,是基于Gradle的, 而Gradle又是基于Groovy, Groovy又是基于Java的 Android Studio 的gradle 本身 ...

  3. Position、Float

    http://www.cnblogs.com/coffeedeveloper/p/3145790.html

  4. 东大OJ-1051-旅行家的预算

    1051: 旅行家的预算 时间限制: 1 Sec  内存限制: 128 MB 提交: 27  解决: 7 [提交][状态][讨论版] 题目描述 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市( ...

  5. 34-nl 简明笔记

    为文本文件添加行号 nl [options] files 参数 files是nl需要为其添加行号的文本文件路径名,如果有多个文件,则nl会把多个文件合在一起编号,并输出到标准输出上 选项 -b     ...

  6. Hibernated的sql查询

    记录一下学习Hibernate的心得 1.为什么HIbernate会支持原生态的sql查询? HQL查询语句虽然方便我们查询,但是基于HQL的查询会将查询出来的对象保存到hibernate的缓存当中, ...

  7. html5 播放多个视频。一个接一个的播放

    new个video,指定播放列表的第一个视频路径为src.监听end事件,回调里面把video的src改成列表的下一个,再play. 示意代码:var vList = ['视频地址url1', 'ur ...

  8. 【BZOJ 4516】【SDOI 2016】生成魔咒

    http://www.lydsy.com/JudgeOnline/problem.php?id=4516 后缀自动机直接做...省选时cena评测竟然没有卡掉map 每次加一个字符,增加的子串数目为n ...

  9. 【PKUSC 2015的一道数学题】

    有9个人,每三个人中至少有两个互相认识,求证这里面至少有4个人互相认识 PKU官方题解: 引理:二染色K6中一定有同色K3. 证明:考虑某一个点,它一定连出至少三条同色边(不妨设为红边),这三条边连的 ...

  10. 【BZOJ 2599】【IOI 2011】Race 点分治

    裸的点分治,然而我因为循环赋值$s$时把$i <= k$写成$i <= n$了,WA了好长时间 #include<cstdio> #include<cstring> ...