从Trie谈到AC自动机
ZJOI的SAM让我深受打击,WJZ大神怒D陈老师之T3是SAM裸题orz...我还怎么混?暂且写篇`从Trie谈到AC自动机`骗骗经验.
Trie
Trie是一种好玩的数据结构.它的每个结点存的是字母,因此得名`字母树`.
出一张图让大家感受下.

(image powered by SaiBu NaoCu)
上面那是一棵插入了
ape,app,applicant,application,bake,ban,banana
等词的Trie.红色结点表示接受态.
显然,查找时只需顺着链照下来,插入只需边查找边插入.
(删除只需除去接受态,或此时在它没有子结点时删除到它的最近接受态父结点)
好懂好写高效率.
AC自动机
AC自动机是一种基于Trie的数据结构.它是一个真正的自动机.
AC自动机,简单地说就是加了一些奇怪东西的Trie.

(powered by cocoa....Cacoo)
实线表示Trie上的路径,虚线表示Fail指针.
Fail指针是什么呢?当你在这个结点上时,对于下一个字符失匹配时你要走的路.很类似于KMP的next数组.
它的定义也是基本一样的.最长有相同前缀的后缀(的那个前缀的最后一个字母结点的指针).
使用起来更是一样.计算也是一样的.顺着fat(s[p-1])的fail(next[k])跳到可以匹配为止.
简单吧?和KMP很像.
那么问题又来了.怎么输出呢?
我们再画个图想想.

原来,顺着Fail指针一直走下去即可啊...
那么我们就有了用AC自动机匹配的算法.

匹配第一个`A`,从root往下找

找到匹配,A的匹配加一.向下寻找下一个字符找到Null.

因Fail指针回跳到root.寻找字符C.

寻找字符B.不是接受态,继续.

A是一个接受态.沿着Fail指针走回去输出结果.

-------------------

匹配C失跳.

------------------------------

...........................

...................最终

结果

构造一个AC自动机
那么,如何构造一个AC自动机呢?
显然可以在每加入一个结点时沿着它的父亲的Fail指针走,走到第一个有相同字符子结点的找到那个子结点,将Fail指向那个结点;如果到root还没找到有同字符子结点,将Fail指向root.
这是在线的做法.离线当然可以用BFS解决,这样保证了当一个结点被处理时它的父亲那层的结点已经处理完.Fail结点最近也只可能在父亲那层.复杂度应与在线办法相同.
Update: 犯了个SB错,AC自动机不可在线.原因Fail指针可能改变.
图表地址:https://cacoo.com/diagrams/xqj6UFk5zcllgHGW
从Trie谈到AC自动机的更多相关文章
- [知识点]Trie树和AC自动机
// 此博文为迁移而来,写于2015年5月27日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102w1s8.html 1.前 ...
- 【 POJ - 1204 Word Puzzles】(Trie+爆搜|AC自动机)
Word Puzzles Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 10782 Accepted: 4076 Special ...
- 算法笔记--字典树(trie 树)&& ac自动机 && 可持久化trie
字典树 简介:字典树,又称单词查找树,Trie树,是一种树形结构,是哈希树的变种. 优点:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较. 性质:根节点不包含字符,除根节点外每一个 ...
- Trie树&kmp&AC自动机&后缀数组&Manacher
Trie 计数+Trie,读清题意很重要 https://vjudge.net/problem/UVALive-5913 kmp AC自动机 模板:https://vjudge.net/problem ...
- 浅谈算法——AC自动机
在学习AC自动机之前,你需要两个前置知识:Trie树,KMP 首先我们需要明白,AC自动机是干什么的(用来自动AC的) 大家都知道KMP算法是求单字符串对单字符串的匹配问题的,那么多字符在单字符上匹配 ...
- [HNOI2004]L语言 trie树? Ac自动机? hash!!
题目描述 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章T是由若干小写字母构成.一个单词W也是由若干小写字母构成.一个字典D是若干个单词的 ...
- Trie图(AC自动机)总结
AC自动机构建完成后,某个节点沿着Fail链向上能从长到短走到自己的所有后缀.一般的,遍历主串进行匹配,就是在Trie图上定向移动的过程. 构造(一遍 BFS) void build_AC() { ; ...
- AC自动机(trie图版)
AC自动机是一个多模字符串匹配的自动机(网上说的),主要作用是在一个长串中同时进行多个字符串的匹配 基础芝士: trie树(字典树) 烤馍片kmp单模字符串匹配 如果不会的建议去网上学一下(本篇讲解略 ...
- 【AC自动机&&Trie图】积累
以前KMP和后缀系列(主要是后缀数组,后缀自动机),都刷了一定数量的题,但是对于AC自动机,却有些冷落,罪过. 但是我感觉,在蓝桥杯比赛中AC自动机出现的概率比后缀系列大,简单的会考匹配,稍难一点会考 ...
随机推荐
- 琐碎--选择文件夹(路径)+生产txt格式的log+数据库操作方式
记录日常工作常用到的一些方法: 1 选择文件操作,并将文件的路径记录下来: OpenFileDialog ofd = new OpenFileDialog(); ofd.Multiselect = f ...
- JavaScript基础---作用域,匿名函数和闭包
匿名函数就是没有名字的函数,闭包是可访问一个函数作用域里变量的函数. 一.匿名函数 //普通函数 function box() { //函数名是 box return 'TT'; } //匿名函数 f ...
- javascript this 详解
前言 Javascript是一门基于对象的动态语言,也就是说,所有东西都是对象,一个很典型的例子就是函数也被视为普通的对象.Javascript可以通过一定的设计模式来实现面向对象的编程,其中this ...
- SpringMvc_@RequestMapping设置Router Url大小写不敏感
http://stackoverflow.com/questions/4150039/how-can-i-have-case-insensitive-urls-in-spring-mvc-with-a ...
- web.xml中/与/*的区别
1.拦截"/",可以实现现在很流行的REST风格.很多互联网类型的应用很喜欢这种风格的URL.为了实现REST风格,拦截了所有的请求.同时对*.js,*.jpg等静态文件的访问也就 ...
- groovy-集合
Lists 你能使用下面的方法创建一个lists,注意[]是一个空list. 1 def list = [5, 6, 7, 8] 2 assert list.get(2) == 7 3 assert ...
- jquery------脚注的使用
index.jsp <script type="text/javascript" src="../js/my.js"></script> ...
- matlab学习笔记 bsxfun函数
matlab学习笔记 bsxfun函数 最近总是遇到 bsxfun这个函数,前几次因为无关紧要只是大概看了一下函数体去对比结果,今天再一次遇见了这个函数,想想还是有必要掌握的,遂查了些资料总结如下. ...
- day4作业之信息表
实在是太low了,终究是自己写的,记录下 #!/usr/bin/env python # coding=utf8 import os, re #这里我把查询这块分为3个函数了,纠结了很久是放一起还是分 ...
- BurpSuite之SQL Injection
BurpSuite之SQL Injection[平台]:mutillidae[工具]BurpSuite 1.4.07 + FireFox1:安装配置mutillidae如果遇到问题,开下面的帖子.ht ...