AC 自动机
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 自动机的更多相关文章
- 基于trie树做一个ac自动机
基于trie树做一个ac自动机 #!/usr/bin/python # -*- coding: utf-8 -*- class Node: def __init__(self): self.value ...
- AC自动机-算法详解
What's Aho-Corasick automaton? 一种多模式串匹配算法,该算法在1975年产生于贝尔实验室,是著名的多模式匹配算法之一. 简单的说,KMP用来在一篇文章中匹配一个模式串:但 ...
- python爬虫学习(11) —— 也写个AC自动机
0. 写在前面 本文记录了一个AC自动机的诞生! 之前看过有人用C++写过AC自动机,也有用C#写的,还有一个用nodejs写的.. C# 逆袭--自制日刷千题的AC自动机攻克HDU OJ HDU 自 ...
- BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]
2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 2545 Solved: 1419[Submit][Sta ...
- BZOJ 3172: [Tjoi2013]单词 [AC自动机 Fail树]
3172: [Tjoi2013]单词 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 3198 Solved: 1532[Submit][Status ...
- BZOJ 1212: [HNOI2004]L语言 [AC自动机 DP]
1212: [HNOI2004]L语言 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1367 Solved: 598[Submit][Status ...
- [AC自动机]【学习笔记】
Keywords Search Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)To ...
- AC自动机 HDU 3065
大概就是裸的AC自动机了 #include<stdio.h> #include<algorithm> #include<string.h> #include< ...
- AC自动机 HDU 2896
n个字串 m个母串 字串在母串中出现几次 #include<stdio.h> #include<algorithm> #include<string.h> #inc ...
- 【BZOJ-3881】Divljak AC自动机fail树 + 树链剖分+ 树状数组 + DFS序
3881: [Coci2015]Divljak Time Limit: 20 Sec Memory Limit: 768 MBSubmit: 508 Solved: 158[Submit][Sta ...
随机推荐
- React Native开发技术周报2
(1).资讯 1.React Native 0.22_rc版本发布 添加了热自动重载功能 (2).技术文章 1.用 React Native 设计的第一个 iOS 应用 我们想为用户设计一款移动端的应 ...
- python数字图像处理(16):霍夫圆和椭圆变换
在极坐标中,圆的表示方式为: x=x0+rcosθ y=y0+rsinθ 圆心为(x0,y0),r为半径,θ为旋转度数,值范围为0-359 如果给定圆心点和半径,则其它点是否在圆上,我们就能检测出来了 ...
- 几张图弄明白ios布局中的尺寸问题
背景 先说说逆向那事.各种曲折..各种技术过时,老老实实在啃看雪的帖子..更新会有的. 回正题,这里讨论的是在Masnory框架下的布局问题.像我这种游击队没师傅带,什么都得自己琢磨,一直没闹明白下面 ...
- 反距离权重插值inverse distance weighting,IDW
反距离权重 (IDW) 插值显式假设:彼此距离较近的事物要比彼此距离较远的事物更相似.当为任何未测量的位置预测值时,反距离权重法会采用预测位置周围的测量值.与距离预测位置较远的测量值相比,距离预测位置 ...
- 数据库表转javaBean
复制后修改部分代码 package com.study; import java.io.BufferedWriter; import java.io.File; import java.io.File ...
- Windows平台下安装Hadoop
今天参照这个网址(http://www.cnblogs.com/kinglau/archive/2013/08/20/3270160.html)安装了下,前面七步没有问题. 到第八步出问题了,后来看了 ...
- linux core dump 文件 gdb分析
core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 叫core dump. (linux中如果内存越界会收到SIG ...
- tab切换(修改)
html代码: <div class="tabContent"> <ul class="tab clearFix"> <li cl ...
- 【UOJ #20】【NOIP 2014】解方程
http://uoj.ac/problem/20 并不会做...然后看题解....... 对a取模,避免了高精度带来的复杂度,然后再枚举x判断是否满足模意义下等于0. 取5个模数,我直接抄的别人的_( ...
- mysql查看数据库
进入MySQL Command line client下查看当前使用的数据库: mysql>select database(); mysql>status; mysql>show t ...