[LuoguP3808] 【模板】AC自动机(简单版)数组版
待填坑
Code
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
const int N=1000000+1000;
struct AC_AutoMation
{
#define root 0
static const int sigma_size=26;
struct node
{
int nxt[sigma_size],sum,fa,fail;
}t[N*5];
int tot;
void Insert(char c[])
{
int now=root,len=strlen(c+1);
for(int i=1;i<=len;i++)
{
if(t[now].nxt[c[i]-'a']==0)
t[now].nxt[c[i]-'a']=++tot;
now=t[now].nxt[c[i]-'a'];
}
t[now].sum++;
}
void Build()
{
queue <int> Q;
for(int i=0;i<sigma_size;i++)
if(t[root].nxt[i]!=0)
Q.push(t[root].nxt[i]);
while(!Q.empty())
{
int now=Q.front();
Q.pop();
for(int i=0;i<sigma_size;i++)
if(t[now].nxt[i]!=0)
{
int temp=t[now].fail;
while(t[temp].nxt[i]==0 and temp!=root)
temp=t[temp].fail;
t[t[now].nxt[i]].fail=t[temp].nxt[i];
Q.push(t[now].nxt[i]);
}
}
}
int Query(char c[])
{
int ans=0,len=strlen(c+1),now=root;
for(int i=1;i<=len;i++)
{
int x=c[i]-'a';
while(t[now].nxt[x]==0 and now!=root) now=t[now].fail;
now=t[now].nxt[x];
int temp=now;
while(temp!=root)
{
if(t[temp].sum>=0)
{
ans+=t[temp].sum;
t[temp].sum=-1;
temp=t[temp].fail;
}
else break;
}
}
return ans;
}
#undef root
}trie;
int n;
char c[N];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%s",c+1);
trie.Insert(c);
}
trie.Build(); scanf("%s",c+1);
printf("%d",trie.Query(c));
return 0;
}
[LuoguP3808] 【模板】AC自动机(简单版)数组版的更多相关文章
- luoguP3808[模板]AC自动机(简单版)
传送门 ac自动机模板题,裸的多串匹配 代码: #include<cstdio> #include<iostream> #include<algorithm> #i ...
- 洛谷P2414 阿狸的打字机 [NOI2011] AC自动机+树状数组/线段树
正解:AC自动机+树状数组/线段树 解题报告: 传送门! 这道题,首先想到暴力思路还是不难的,首先看到y有那么多个,菜鸡如我还不怎么会可持久化之类的,那就直接排个序什么的然后按顺序做就好,这样听说有7 ...
- 【BZOJ】2434: [Noi2011]阿狸的打字机 AC自动机+树状数组+DFS序
[题意]阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母. 经阿狸研究发现,这个打字机是这样工作的: l 输入小写 ...
- hdu 1277 AC自动机入门(指针版和数组版)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1277 推荐一篇博客(看思路就可以,实现用的是java): https://www.cnblogs.co ...
- 字典树模板( 指针版 && 数组版 )
模板 : #include<string.h> #include<stdio.h> #include<malloc.h> #include<iostream ...
- BZOJ2434: [Noi2011]阿狸的打字机(AC自动机 树状数组)
Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 4140 Solved: 2276[Submit][Status][Discuss] Descript ...
- 「模拟赛20180306」回忆树 memory LCA+KMP+AC自动机+树状数组
题目描述 回忆树是一棵树,树边上有小写字母. 一次回忆是这样的:你想起过往,触及心底--唔,不对,我们要说题目. 这题中我们认为回忆是这样的:给定 \(2\) 个点 \(u,v\) (\(u\) 可能 ...
- Codeforces 547E - Mike and Friends(AC 自动机+树状数组)
题面传送门 好久每做过 AC 自动机的题了--做几个题回忆一下罢 AC 自动机能够解决多串匹配问题,注意是匹配,碰到前后缀的问题那多半不在 AC 自动机能解决的范围内. 在初学 AC 自动机的时候相信 ...
- tyvj P1519 博彩游戏(AC自动机+DP滚动数组)
P1519 博彩游戏 背景 Bob最近迷上了一个博彩游戏…… 描述 这个游戏的规则是这样的:每花一块钱可以得到一个随机数R,花上N块钱就可以得到一个随机序列:有M个序列,如果某个序列是产生的随机序列的 ...
- 算法模板——AC自动机
实现功能——输入N,M,提供一个共计N个单词的词典,然后在最后输入的M个字符串中进行多串匹配(关于AC自动机算法,此处不再赘述,详见:Aho-Corasick 多模式匹配算法.AC自动机详解.考虑到有 ...
随机推荐
- Java泛型中的类型参数和通配符类型
类型参数 泛型有三种实现方式,分别是泛型接口.泛型类.泛型方法,下面通过泛型方法来介绍什么是类型参数. 泛型方法声明方式:访问修饰符 <T,K,S...> 返回类型 方法名(方法参数){方 ...
- Python-反向迭代和实现反向迭代
案例: 实现一个连续的浮点数发生器,FloatRange,根据给定范围(start, end) 和步进值,产生一些列的浮点数,例如:FloatRange(3,4,0.2),将产生下列序列: 正向:3. ...
- python下的appium控制andriod按键
今天查看视频的时候,发现不好控制关闭视频,于是就想控制手机的返回按键来达到返回的效果. 找到了一些关于按键的keycode,如下: KEYCODE_CALL 拨号键 5 KEYCODE_ENDCALL ...
- 编程体系结构(05):Java多线程并发
本文源码:GitHub·点这里 || GitEE·点这里 一.多线程导图 二.多线程基础 1.基础概念 线程是操作系统能够进行运算调度的最小单位,包含在进程之中,是进程中的实际运作单位.一条线程指的是 ...
- JavaScript函数报错SyntaxError: expected expression, got ';'
故事背景:编写Javaweb项目,在火狐浏览器下运行时firebug报错SyntaxError: expected expression, got ';'或者SyntaxError: expected ...
- Arduino 寻找I2C地址address
参考:http://henrysbench.capnfatz.com/henrys-bench/arduino-projects-tips-and-more/arduino-quick-tip-fin ...
- 怀疑安装MySQL之后,导致OrCAD Capture、Allegro就打不开
记得在异常出现之前,只安装了MySQL,之后OrCAD Capture.Allegro就打不开了. Capture.exe - 系统错误 allegro.exe - 系统错误 我尝试在Cadence的 ...
- Linux系统编程 —共享内存之mmap
共享内存概念 共享内存是通信效率最高的IPC方式,因为进程可以直接读写内存,而无需进行数据的拷备.但是它没有自带同步机制,需要配合信号量等方式来进行同步. 共享内存被创建以后,同一块物理内存被映射到了 ...
- 多测师讲解jmeter _图片详解_(全)高级讲师肖sir
- 多测师讲解接口 _需求文档(用户增删改查)_高级讲师肖sir
首先连接Duoceshi_new网络 密码为Duoceshi_new,因为接口项目部署在Duoceshi_new网段中. 测试工具:postman域名:http://192.168.1.2:8081/ ...