Trie图和AC自动机的区别

Trie图是AC自动机的确定化形式,即把每个结点不存在字符的next指针都补全了。这样做的好处是使得构造fail指针时不需要next指针为空而需要不断回溯。

比如构造next[cur][i]的fail指针,cur为父节点,next[cur][i]为cur的儿子结点,如果是AC自动机,如果父亲结点tmp(tmp是cur的一份拷贝)的next[fail[tmp]][i]不存在时,需要让tmp不断回溯(即tmp = fail[tmp]),直到next[fail[tmp]][i]不为空时,才让fail[next[cur][i]] = next[fail[tmp]][i]。

如果是Trie图,那么直接让fail[next[cur][i]] = next[fail[cur]][i]就可以了,因为Trie图已经补全了next指针。

但是不管是Trie图还是AC自动机,它们的fail指针的指向都是一模一样的。所以不管是用Trie图还是AC自动机都可以构造fail树。不过Trie图比AC自动机好写多了,所以我一直都是写Trie图而不是自动机。

fail指针的性质

要能够灵活使用Fail树,首先需要了解fail指针的性质,所以先说下fail指针都有哪些性质。

每个结点的fail指针都指向自己的最长后缀,那么很重要的一个性质就是让一个结点cur的fail指针不断回溯向上走,直到碰到根结点为止,那么回溯时经过的结点所代表的字符串都是结点cur所代表的字符串的后缀。

什么是Fail树

下面的第一幅图是AC自动机,第二幅图是Fail树。之所以第一幅图是AC自动机而不是Trie图的原因是Trie图太特么难画了。不过具体的原理还是没有变的。

可以看出Fail树其实就是将AC自动机的next指针去掉,然后反转fail指针的指向所构造出来了,而且可以肯定这一定是一棵树 ,所以称之为Fail树。

Fail树的一个性质是,某个结点所对应的字符串肯定是其儿子结点,孙子结点. . .所对应的字符串的后缀。

Fail树的应用

如果有n个字符串,所有字符串的长度加起来不超过$10^6$,有m个查询,要查询第x个字符串在第y个字符串中出现了多少次。

如果是使用AC自动机查询,可以直接对字符串构建AC自动机,然后让y去走AC自动机,对于走过的结点,把其权值加1。那么要查询x在y中出现了多少次,便要从底层开始,顺着fail指针把权值上传。然后只要查询x结点的权值是多少就知道x在y中出现了多少次。每次查询的复杂度是O(tot+len[y]),其中tot是AC自动机的结点总数。

如果是使用Fail树进行查询,那么只要查询所有子结点的权值和就好了,子结点的权值和可以使用dfs序和树状数组来维护。然后同样让有去走AC自动机,将走过的结点的权值加1,只不过现在是用树状数组来维护权值。那么要查询x在y中出现了多少次,只要进行一次区间查询就可以了,即只要查询x结点的所有子结点就好了(根据fail树的性质),因为其dfs序号是连续的,所以是一次区间查询。可以将查询按照y排序,然后对具有相同y的查询一起查询。每次查询时间复杂度是O(len[y]+log(tot))。

该文章在我的个人博客地址是:http://www.alphaway.org/post-440.html

转载于:https://www.cnblogs.com/justPassBy/p/5412110.html

Trie图和Fail树相关推荐

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

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

  2. HiHocoder 1036 : Trie图 AC自动机

    Trie图 先看一个问题:给一个很长很长的母串 长度为n,然后给m个小的模式串.求这m个模式串里边有多少个是母串的字串. 最先想到的是暴力O(n*m*len(m)) len(m)表示这m个模式串的平均 ...

  3. [hiho 04]Trie图

    题目描述 Trie 图就是在 Trie 树上建立 fail 指针,类似于KMP算法中的next数组的作用. 这个数据结构的作用是判断一个字符串中是否包含一组字符串中的任意一个. 结构体定义是这样的: ...

  4. P5357 【模板】AC自动机(二次加强版)(AC自动机建fail树dfs求模式串出现次数)

    P5357 [模板]AC自动机(二次加强版)(AC自动机建fail树dfs求模式串出现次数) 传送门 形式上,AC 自动机基于由若干模式串构成的 Trie 树,并在此之上增加了一些 fail 边:本质 ...

  5. hiho一下 第四周 Hihocoder #1036 : Trie图

    #1036 : Trie图 时间限制:20000ms 单点时限:1000ms 内存限制:512MB 描述 前情回顾 上回说到,小Hi和小Ho接受到了河蟹先生伟大而光荣的任务:河蟹先生将要给与他们一篇从 ...

  6. Burst trie(爆炸式字典树)解读

    burst trie(爆炸式字典树) Burst trie组成介绍 burst trie有三个不同的组成部分,一组records,一组containers,还有一个access trie. recor ...

  7. 【BZOJ-2938】病毒 Trie图 + 拓扑排序

    2938: [Poi2000]病毒 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 609  Solved: 318 [Submit][Status][ ...

  8. CodeForces - 1437G Death DBMS(AC自动机fail树上树链剖分建线段树/暴跳fail)

    题目链接:点击查看 题目大意:给出 n 个模式串,每个模式串初始时的权值为 0,然后有 m 次操作: 1 i x:将第 i 个模式串的权值修改为 x 2 s:给出一个字符串 s,询问字符串 s 作为主 ...

  9. 洛谷P5357 - 【模板】AC自动机(二次加强版)(AC自动机+fail树)

    题目链接:点击查看 题目大意:给出n个模式串,问在主串中分别出现了多少次 题目分析:如果像以往那样,在匹配的时候fail指针乱跳的话,那么是错误的AC自动机使用方法,时间复杂度也大大上升,接近于暴力的 ...

  10. hdu2457 Trie图+dp

    hdu2457 给定n个模式串, 和一个文本串 问如果修改最少的字符串使得文本串不包含模式串, 输出最少的次数,如果不能修改成功,则输出-1 dp[i][j] 表示长度为i的字符串, 到达状态j(Tr ...

最新文章

  1. Josephus Problem的详细算法及其Python, Java语言的实现
  2. Makefile_07:Make 的工作方式
  3. 牛客 - Elo mountains(AC自动机+可持久化数组优化)
  4. telegraf输出MySQL_Grafana+influxdb+telegraf初探-快速监控主机与mysql
  5. MySQL数据库安装与配置详解
  6. 这是一张超级长长长长的长图·····
  7. matlab rgb2ntsc函数,matlab 颜色模型之间的转换
  8. java tcp聊天程序_java实现基于Tcp的socket聊天程序
  9. 深度探索Qt窗口系统——布局篇
  10. 百度推广怎么样做才可以有效果呢?
  11. 项目合同管理 试题分析
  12. 电视机顶盒CM311-1A-YST基于openwrt搭建pptpipsec服务器
  13. 论文阅读——基于语法语义融合学习的功能代码克隆检测
  14. GIS空间分析 数字地形分析4 明暗等高线的制作
  15. 数控技术转行java_我29岁想转行数控却找不到工作
  16. 计算机相关专业提升学历的解决方案(本科及以下)
  17. 微信小程序跳转公众号(引导关注)之 使用公众号消息
  18. cpa机考可以用计算机吗,CPA机考,不让带计算器该如何做?
  19. 【扫盲】什么是回程网络(backhaul network )、计算图优化
  20. C# 特殊运算符 单问号(?)和双问号(??)

热门文章

  1. 【论文阅读】Fully Convolutional Networks for Semantic Segmentation
  2. 【语义相似度】ESIM:语义相似度领域小模型的尊严
  3. BERT meet Knowledge Graph:预训练模型与知识图谱相结合的研究进展
  4. 【对话】对话系统经典:检索式对话
  5. 【Linux】最常用命令:简单易学,但能解决95%以上的问题
  6. pyspark 学习笔记——pyspark安装
  7. nlp基础—9.条件随机场模型(CRF算法)
  8. 数据中台是什么?数据中台应包含什么?来听听袋鼠云合伙人张旭的回答!
  9. iPhone SDK开发基础之使用UITabBarController组织和管理UIView
  10. 02矩阵01 ——概念、运算和基本矩阵、对角矩阵、方幂、数量矩阵、转置矩阵、对称矩阵、逆矩阵、奇异矩阵、三角矩阵、矩阵乘积的行列式与秩