Trie图(模板)
Trie图(蒟蒻听说AC自动机能做的题Trie图都能做,而且AC自动机可能被卡,就没学过AC自动机),最近想捡一捡,好久之前做的了。
Trie图,就是一个在Trie树上建的图 大概描述一下
比如说有几个字符串:
abc
abcd
bcd
bacd
jdr
ac
先把它们存在Trie树中:
就像KMP那样,做出这样的逻辑判断:
bacd比较到第三位bac结果没有d,但起码bac有了,所以以bac为前缀的或以bac后缀为前缀的串是不用再比较前缀了。
所以出现了fail指针,为失配情况重新定位方案。
类似于next数组。
无解(定位不到失配后新方案),就指向根表示无解。
显而易见,首字母失配是一定没有方案的。
其次,一个字母失配可以定位到父节点失配的自己值子节点。
一个优化:没有新子节点的节点直接指向fail指针自己值子节点。
建出来Trie图是这样的:
匹配时类似KMP:
模板代码(luogu P3808 【模板】AC自动机(简单版)):
- #include<queue>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- struct trnt{
- int ch[];
- int val;
- int fl;
- }tr[];
- std::queue<int>Q;
- char tmp[];
- int siz;
- int n;
- void add(char *a)
- {
- int len=strlen(a+);
- int root=;
- for(int i=;i<=len;i++)
- {
- int c=a[i]-'a';
- if(!tr[root].ch[c])
- tr[root].ch[c]=++siz;
- root=tr[root].ch[c];
- }
- tr[root].val++;
- }
- void Build()
- {
- int root=;
- for(int i=;i<;i++)
- if(tr[root].ch[i])
- Q.push(tr[root].ch[i]);
- while(!Q.empty())
- {
- root=Q.front();
- Q.pop();
- for(int i=;i<;i++)
- {
- if(tr[root].ch[i])
- {
- tr[tr[root].ch[i]].fl=tr[tr[root].fl].ch[i];
- Q.push(tr[root].ch[i]);
- }else
- tr[root].ch[i]=tr[tr[root].fl].ch[i];
- }
- }
- return ;
- }
- int Cal(char *a)
- {
- int len=strlen(a+);
- int ans=;
- int root=;
- for(int i=;i<=len;i++)
- {
- int c=a[i]-'a';
- root=tr[root].ch[c];
- for(int j=root;j&&(tr[j].val!=-);j=tr[j].fl)
- {
- ans+=tr[j].val;
- tr[j].val=-;
- }
- }
- return ans;
- }
- int main()
- {
- scanf("%d",&n);
- for(int i=;i<=n;i++)
- {
- scanf("%s",tmp+);
- add(tmp);
- }
- Build();
- scanf("%s",tmp+);
- printf("%d\n",Cal(tmp));
- return ;
- }
Trie图(模板)的更多相关文章
- Trie图 模板
trie图实际上是优化的一种AC自动机. trie图是在trie树上加一些失配指针,实际上是类似KMP的一种字符串匹配算法. 失配指针类似KMP的nx数组,有效地利用了之前失配的信息,优化了时间复杂度 ...
- 小菜鸟 菜谈 KMP->字典树->AC自动机->trie 图 (改进与不改进)
本文的主要宗旨是总结自己看了大佬们对AC自动机和trie 图 的一些理解与看法.(前沿:本人水平有限,总结有误,希望大佬们可以指出) KMP分割线--------------------------- ...
- 模板—trie图
做了某题之后发现trie的AC自动机太垃圾了,动不动就TLE,然后我就去学了trie图. #include<iostream> #include<cstdio> using n ...
- 【hihoCoder 1036】Trie图
看了一下简单的$Trie图$,调模板调啊调一连调了$2h$,最后发现$-'a'$打成$-'A'$了hhh,有种摔键盘的冲动. $Trie图$是$Trie树$上建立“前缀边”,不用再像在$Trie树$上 ...
- 【AC自动机&&Trie图】积累
以前KMP和后缀系列(主要是后缀数组,后缀自动机),都刷了一定数量的题,但是对于AC自动机,却有些冷落,罪过. 但是我感觉,在蓝桥杯比赛中AC自动机出现的概率比后缀系列大,简单的会考匹配,稍难一点会考 ...
- POJ 2778 DNA Sequence ( AC自动机、Trie图、矩阵快速幂、DP )
题意 : 给出一些病毒串,问你由ATGC构成的长度为 n 且不包含这些病毒串的个数有多少个 分析 : 这题搞了我真特么久啊,首先你需要知道的前置技能包括 AC自动机.构建Trie图.矩阵快速幂,其中矩 ...
- 【BZOJ-2938】病毒 Trie图 + 拓扑排序
2938: [Poi2000]病毒 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 609 Solved: 318[Submit][Status][Di ...
- 【hihoCoder】1036 Trie图
题目:http://hihocoder.com/problemset/problem/1036 给一个词典dict,词典中包含了一些单词words.要求判断给定的一个文本串text中是否包含这个字典中 ...
- HDU 1251 Trie树模板题
1.HDU 1251 统计难题 Trie树模板题,或者map 2.总结:用C++过了,G++就爆内存.. 题意:查找给定前缀的单词数量. #include<iostream> #incl ...
随机推荐
- spring-cloud导入eclipse时,@slf4j注解为什么找不到log变量
原因是缺少插件Lomboz. Lomboz是一个基于LGPL的开源J2EE综合开发环境的Eclipse插件,对编码,发布,测试,以及debug等各个软件开发的生命周期提供支持,支持JSP,EJB等.L ...
- 参考《Python数据处理》中英文PDF+源代码
在实际操作中掌握数据处理方法,比较实用.采用基于项目的方法,介绍用Python完成数据获取.数据清洗.数据探索.数据呈现.数据规模化和自动化的过程.主要内容包括:Python基础知识,如何从CSV.E ...
- rpm2cpio---如何不安装但是获取rpm包中的文件
如何不安装但是获取rpm包中的文件 使用工具rpm2cpio和cpio rpm2cpio xxx.rpm | cpio -idmv 参数i表示提取文件.v表示指示执行进程,d和make-directo ...
- Android布局之RelativeLayout
RelativeLayout用到的一些重要的属性: 第一类:属性值为true或falseandroid:layout_centerHrizontal 水平居中android:layout_center ...
- android对话框显示异常报错:You need to use a Theme.AppCompat theme (or descendant) with this activity.
今天写android实验碰到到一个问题,在用AlertDialog.Builder类构建一个对话框之后,调用Builder.show()方法时抛出异常如下: - ::-/xyz.qlrr.sqlite ...
- Spring MVC学习总结(5)——SpringMVC项目关于安全的一些配置与实现方式
目前越来越多的应用和网站,开始注重安全性的问题,关于我们的web项目的几个安全知识点,不得不讲解一下,这里我主要讲述关于tomcat如何支持HTTPS连接访问,RSA公钥和私钥的制作.这个对于我们整个 ...
- 读书笔记-深入理解JVM虚拟机-1.OOM初探
Java堆OOM(Out-Of-Memory)异常 执行例如以下程序,爆出异常 java.lang.OutOfMemoryError: Java heap space /** * VM Args:-X ...
- Swift vs C# Go OC
Swift vs C# mod=view&aid=21" target="_blank">http://www.swifthumb.com/porta ...
- Python标准库:内置函数ascii(object)
这个函数跟repr()函数一样,返回一个可打印的对象字符串方式表示.当遇到非ASCII码时,就会输出\x,\u或\U等字符来表示. 与Python 2版本号里的repr()是等效的函数. 样例: #a ...
- 具体解释Hibernate中的二级缓存
1.前言 这篇博客再前几篇博客的基础上来解说一下.Hibernate中的二级缓存.二级缓存是属于SessionFactory级别的缓存机制. 第一级别的缓存是Session级别的缓存,是属于事务范围的 ...