Trie图 模板
trie图实际上是优化的一种AC自动机。
trie图是在trie树上加一些失配指针,实际上是类似KMP的一种字符串匹配算法。
失配指针类似KMP的nx数组,有效地利用了之前失配的信息,优化了时间复杂度。
比如trie树上的abc那个节点,失配后会指向bc。
所以我们需要知道上一层节点的fail指针,来求出这一层的fail指针。
那就~BFS吧~
懒得写了,大佬们讲的都比我好。
哪天有空了,可能会再详细写一写吧,补两张图什么的。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std; int n,sz;
int s[][];
int ed[];
int fal[];
char str[]; void ins(char *a)
{
int l=strlen(a+);
int p=;
for(int i=;i<=l;i++)
{
int c=a[i]-'a'+;
if(!s[p][c])s[p][c]=++sz;
p=s[p][c];
}
ed[p]++;
} queue<int>qq; void build()
{
for(int i=;i<=;i++)
if(s[][i])qq.push(s[][i]);
while(!qq.empty())
{
int p=qq.front();
qq.pop();
for(int i=;i<=;i++)
{
if(s[p][i])fal[s[p][i]]=s[fal[p]][i],qq.push(s[p][i]);
else s[p][i]=s[fal[p]][i];
}
}
} int cal(char *a)
{
int l=strlen(a+);
int p=,ans=;
for(int i=;i<=l;i++)
{
int c=a[i]-'a'+;
p=s[p][c];
for(int j=p;j&&~ed[j];j=fal[j])
{
ans+=ed[j];
ed[j]=-;
}
}
return ans;
} int main()
{
scanf("%d",&n);
char str[];
for(int i=;i<=n;i++)
{
scanf("%s",str+);
ins(str);
}
build();
scanf("%s",str+);
int ans=cal(str);
printf("%d",ans);
return ;
}
Trie图 模板的更多相关文章
- 小菜鸟 菜谈 KMP->字典树->AC自动机->trie 图 (改进与不改进)
本文的主要宗旨是总结自己看了大佬们对AC自动机和trie 图 的一些理解与看法.(前沿:本人水平有限,总结有误,希望大佬们可以指出) KMP分割线--------------------------- ...
- Trie图(模板)
Trie图(蒟蒻听说AC自动机能做的题Trie图都能做,而且AC自动机可能被卡,就没学过AC自动机),最近想捡一捡,好久之前做的了. Trie图,就是一个在Trie树上建的图 大概描述一下 比如说有 ...
- 模板—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 ...
随机推荐
- C - Monitor CodeForces - 846D (二维前缀和 + 二分)
Recently Luba bought a monitor. Monitor is a rectangular matrix of size n × m. But then she started ...
- redis的过期策略
1.了解redis 什么是Redis,为啥用缓存? Redis是用内存当缓存的.Redis主要是基于内存来进行高性能.高并发的读写操作的. 内存是有限的,比如Redis就只能用10个G,你一直往里面写 ...
- C++数组常用操作
1. 遍历数组 使用基于范围的for循环来遍历整个数组 用_countof()来得到数组中的元素个数 #include <iostream> #include <cstdio> ...
- Hibernate(四)--延迟加载(lazyload)
hibernate中的延迟加载(lazyload)分属性的延迟加载和关系的延迟加载 属性的延迟加载: 当使用load的方式来获取对象的时候,只有访问了这个对象的属性,hibernate才会到数据库中进 ...
- zabbix自定义添加主机
1.安装zabbix-agent [root@web01 ~]# rpm -ivh https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/3.4/rhe ...
- 吴裕雄--天生自然 pythonTensorFlow图形数据处理:windows操作系统安装指定版本的tensorflow
pip install tensorflow==1.14.0
- C# 使用 HttpPost 请求调用 WebService (转)
转自 https://www.cnblogs.com/Brambling/p/7266482.html 之前调用 WebService 都是直接添加服务引用,然后调用 WebService 方法的,最 ...
- Matlab高级教程_第二篇:Matlab相见恨晚的模块_02_并行运算-关于parfor的问题
1 我们知道MATLAB支持并行运行一般有四种模式: 第一种模式:本机调用多核CPU性能并行运算 第二种模式:本机调用GPU性能并行运算 第三种模式:多计算机组成集群,调用集群CPU性能并行运算 第四 ...
- poj-3259 Wormholes(无向、负权、最短路之负环判断)
http://poj.org/problem?id=3259 Description While exploring his many farms, Farmer John has discovere ...
- [Algo] 66. All Valid Permutations Of Parentheses I
Given N pairs of parentheses “()”, return a list with all the valid permutations. Assumptions N > ...