洛谷P3808 【模板】AC自动机(简单版)
题目背景
这是一道简单的AC自动机模板题。
用于检测正确性以及算法常数。
为了防止卡OJ,在保证正确的基础上只有两组数据,请不要恶意提交。
管理员提示:本题数据内有重复的单词,且重复单词应该计算多次,请各位注意
题目描述
给定n个模式串和1个文本串,求有多少个模式串在文本串里出现过。
输入输出格式
输入格式:
第一行一个n,表示模式串个数;
下面n行每行一个模式串;
下面一行一个文本串。
输出格式:
一个数表示答案
输入输出样例
2
a
aa
aa
2
说明
subtask1[50pts]:∑length(模式串)<=10^6,length(文本串)<=10^6,n=1;
subtask2[50pts]:∑length(模式串)<=10^6,length(文本串)<=10^6;
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
long long read()
{
long long x=,f=;
char ch=getchar();
while(ch>''||ch<'')
{
if(ch=='-')
f=-;
ch=getchar();
}
while(ch>=''&&ch<='')
{
x=x*+ch-'';
ch=getchar();
}
return x*f;
}
const int maxn=1e6+;
char mob[maxn];
int q[maxn];
int n,cnt;
struct node
{
int fail,num;
int ch[];
} t[maxn];
void insert()
{
int len=strlen(mob),u=;
for(int i=; i<len; i++)
{
int s=mob[i]-'a';
if(t[u].ch[s]==)
t[u].ch[s]=++cnt;
u=t[u].ch[s];
}
t[u].num++;
}
void getfail()
{
int l=,r=;
for(int i=; i<; i++)
if(t[].ch[i]!=)
{
t[t[].ch[i]].fail=;
q[++r]=t[].ch[i];
}
while(l<r)
{
int u=q[++l];
for(int i=; i<; i++)
{
int v=t[u].ch[i];
if(v)
{
t[v].fail=t[t[u].fail].ch[i];
q[++r]=v;
}
else
t[u].ch[i]=t[t[u].fail].ch[i];
}
}
}
int query()
{
int len=strlen(mob);
int u=,ans=;
for(int i=; i<len; i++)
{
int s=mob[i]-'a';
u=t[u].ch[s];
int v=u;
while(v&&t[v].num!=-)
{
ans+=t[v].num;
t[v].num=-;
v=t[v].fail;
}
}
return ans;
}
int main()
{
n=read();
for(int i=; i<=n; i++)
{
cin>>mob;
insert();
}
t[].fail=;
getfail();
cin>>mob;
printf("%d",query());
return ;
}
洛谷P3808 【模板】AC自动机(简单版)的更多相关文章
- 洛谷P3808 & P3796 AC自动机模板
题目:P3808:https://www.luogu.org/problemnew/show/P3808 P3796:https://www.luogu.org/problemnew/show/P37 ...
- 洛谷 - P3966 - 单词 - AC自动机
https://www.luogu.org/problemnew/show/P3966 因为文本串就是字典本身,所以这个和平时的AC自动机不太一样.平时的query要沿着fail树把子树的出现次数依次 ...
- [模板][P3808]AC自动机(简单版)
Description: 求n个模式串中有几个在文本串中出现 Solution: 模板,详见代码: #include<bits/stdc++.h> using namespace std; ...
- 洛谷.3121.审查(AC自动机 链表)
题目链接 //删掉一个单词需要前移一段位置,用链表维护就好了 复杂度O(sum(len)) #include <cstdio> #include <cstring> #defi ...
- 洛谷 - P2444 - 病毒 - AC自动机
https://www.luogu.org/problemnew/show/P2444 有点恶心,不太明白fail的意义. #include<bits/stdc++.h> using na ...
- 洛谷 P3804 [模板] 后缀自动机
题目:https://www.luogu.org/problemnew/show/P3804 模仿了一篇题解,感觉很好写啊. 代码如下: #include<cstdio> #include ...
- 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)
To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...
- 【刷题】洛谷 P3808 【模板】AC自动机(简单版)
题目背景 这是一道简单的AC自动机模板题. 用于检测正确性以及算法常数. 为了防止卡OJ,在保证正确的基础上只有两组数据,请不要恶意提交. 管理员提示:本题数据内有重复的单词,且重复单词应该计算多次, ...
- 洛谷 P3808 【模板】AC自动机(简单版)
传送门:https://www.luogu.org/problem/P3808 题解:是一个AC自动机的裸题了,注释加在代码里面了 #include<bits/stdc++.h> usin ...
随机推荐
- 关于Discuz! X系列UC_Server 本地文件包含漏洞
最近又发现discuz论坛被挂马了,决定好好研究一下discuz的漏洞,技术债始终要还是要还的 一.问题发现 快要睡觉的时候,突然收到一封邮件,发现服务器上的文件被篡改了,立即登录服务器,清空恶意文件 ...
- 单片机成长之路(51基础篇) - 015 关于sdcc的多文件编译范例二
本文是续 单片机成长之路(51基础篇) - 009 关于sdcc的多文件编译范例(一)编写的. 在实际的工作中,单片机的头文件和功能函数不可能同全部放在同一个文件夹下面,我们把单片机成长之路(51基础 ...
- .NET Core+NLog+存储配置 日志存入到数据库
nlog-config.xml 配置文件: <?xml version="1.0" encoding="utf-8" ?> <nlog xml ...
- hdoj:2069
Coin Change Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- NaviSoft31.源码开发完成
NaviSoft是作者一人开发完成,从之前的1.0版本,到现在的3.1版本.历经2年时间,开发完成 下面是NaviSoft的源码结构 加QQ群了解更多信息
- WebStorm Chinese Language Pack(中文语言包
https://github.com/ewen0930/WebStorm-Chinese http://ewen0930.github.io/2016/04/webstorm-chinese-lang ...
- Linux 文件属性及权限_007
Linux一切皆文件: Llinux系统的文件或目录的属性主要包括:索引节点.文件类型.文件权限.链接数.所属的用户和用户组.最近修改时间等. Llinux文件属性及权限图形说明: Linux文件属性 ...
- PHP下载远程图片的3个方法
From: http://blog.csdn.net/iefreer/article/details/46930239 直接上代码 <?php function dlfile1($file_ur ...
- macOS Sierra 如何卸载.net core 版本
由于目前没有找到一个合适的办法,将本机.NET Core的版本升级到1.1,故只有先卸载再安装最新版本了. 卸载脚本链接为:https://github.com/dotnet/cli/blob/rel ...
- BarTender怎样同时打印自动日期和流水号?
大多数条形码中都会含有日期和数量信息,而且大部分都是两者兼具.有些使用BarTender软件的小伙伴,不知道怎么同时打印自动日期和流水号,即条形码中兼有自动日期和序列号,且它们都能根据打印的变化而变化 ...