洛谷P3796 - 【模板】AC自动机(加强版)
Description
模板题啦~
Code
//【模板】AC自动机(加强版)
#include <cstdio>
#include <cstring>
int const N=2e5;
int const L=1e6+10;
int n;
char s1[200][80],s2[L];
int rt,ndCnt;
int ch[N][26],val[N],fail[N],pre[N];
void ins(char s[],int id)
{
int len=strlen(s),p=rt;
for(int x=0;x<len;x++)
{
int i=s[x]-'a';
if(!ch[p][i]) ch[p][i]=++ndCnt;
p=ch[p][i];
}
val[p]=id;
}
int Q[L],op,cl;
void buildAC()
{
Q[++cl]=rt;
while(op<cl)
{
int p=Q[++op];
for(int i=0;i<26;i++)
{
int q=ch[p][i],p1=fail[p];
if(!q) {ch[p][i]=ch[p1][i]; continue;}
fail[q]=ch[p1][i];
pre[q]=val[fail[q]]?fail[q]:pre[fail[q]];
Q[++cl]=q;
}
}
}
int cnt[200];
void query(char s[])
{
memset(cnt,0,sizeof cnt);
int len=strlen(s),p=rt;
for(int x=0;x<len;x++)
{
p=ch[p][s[x]-'a'];
for(int t=p;t;t=pre[t]) cnt[val[t]]++;
}
}
int main()
{
while(true)
{
scanf("%d",&n); if(!n) break;
ndCnt=0,rt=++ndCnt;
memset(ch,0,sizeof ch); memset(val,0,sizeof val);
memset(fail,0,sizeof fail); memset(pre,0,sizeof pre);
for(int i=0;i<26;i++) ch[0][i]=rt;
for(int i=1;i<=n;i++) scanf("%s",s1[i]),ins(s1[i],i);
buildAC();
scanf("%s",s2); query(s2);
int ans=0;
for(int i=1;i<=n;i++) if(cnt[i]>ans) ans=cnt[i];
printf("%d\n",ans);
for(int i=1;i<=n;i++) if(cnt[i]==ans) puts(s1[i]);
}
return 0;
}洛谷P3796 - 【模板】AC自动机(加强版)的更多相关文章
- 洛谷 - P3966 - 单词 - AC自动机
https://www.luogu.org/problemnew/show/P3966 因为文本串就是字典本身,所以这个和平时的AC自动机不太一样.平时的query要沿着fail树把子树的出现次数依次 ...
- 洛谷.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.求出某区间每一个数的和 输入输出格式 输入格 ...
- 洛谷P1120 小木棍 [数据加强版](搜索)
洛谷P1120 小木棍 [数据加强版] 搜索+剪枝 [剪枝操作]:若某组拼接不成立,且此时 已拼接的长度为0 或 当前已拼接的长度与刚才枚举的长度之和为最终枚举的答案时,则可直接跳出循环.因为此时继续 ...
- 洛谷P3796 【模板】AC自动机(加强版)(AC自动机)
洛谷题目传送门 先膜一发yyb巨佬 orz 想学ac自动机的话,推荐一下yyb巨佬的博客,本蒟蒻也是从那里开始学的. 思路分析 裸的AC自动机,这里就不讲了.主要是这题太卡时了,尽管时限放的很大了.. ...
- 洛谷 P3796 【模板】AC自动机(加强版)(AC自动机)
题目链接:https://www.luogu.com.cn/problem/P3796 AC自动机:复杂度$O( (N+M)\times L )$,N为模式串个数,L为平均长度,M为文章长度. ins ...
- 洛谷-P5357-【模板】AC自动机(二次加强版)
题目传送门 -------------------------------------- 过年在家无聊补一下这周做的几道AC自动机的模板题 sol:AC自动机,还是要解决跳fail边产生的重复访问,但 ...
随机推荐
- CSS深入理解学习笔记之vertical-align
1.vertical-align基本认识 支持的属性值: ①线类:baseline(默认),top,middle,bottom ②文本类:text-top,text-bottom ③上标下标类:sub ...
- query返回值
总结:PDO::query($sql)返回值是一个对象,其中包括了你输入的sql语句 而fetch()方法执行成功则返回包含一条记录的数组,失败返回false. $rs = $pdo -> ...
- func_get_args 获取一个函数的所有参数
func_get_args 获取一个函数的所有参数 { $numargs = func_num_args(); //参数数量 echo "参数个数是: $numargs&l ...
- tomcat-users.xml 配置
一:tomcat6配置管理员信息 1:打开tomcat6下的~/conf/tomcat-users.xml文件,关于用户角色.管理员的信息都在这个配置文件中. 2:在配置文件<tomcat-us ...
- Shell 批量复制文件名相近的文件到指定文件名中
问题: 目录结构如下: test/ 2001.01.01/ 2001.02.02/ 2001.03.02/ 2001.01.03/ 2001.02.04/ 2001.03.05/ 2 ...
- SpringMVC数据验证(AOP处理Errors和方法验证)
什么是JSR303? JSR 303 – Bean Validation 是一个数据验证的规范,2009 年 11 月确定最终方案. Hibernate Validator 是 Bean Valida ...
- Jmeter之性能压测Stepping Thread Group 逐步增加并发数 阶梯式加压并发 (十五)
前段时间有描述过性能的测试类型 配置负载 Big Bang: 负载同时产生 Ramp up: 开始时候产生一定负载,然后每隔一段时间增加一些负载直到达到目标负载,这是典型模式 Ramp-up (wit ...
- 【原创】Struts2.5.12版本中使用通配符*
ι 版权声明:本文为博主原创文章,未经博主允许不得转载. <package name="hellodemo" extends="struts-default&quo ...
- Maven pom.xml简单归结
Maven pom.xml文件解释 请确保有相关的maven知识,包括Maven安装.Maven settings.xml解读.本文对POM的一些属性作一些摘录,详细的配置可查看此篇转载文章" ...
- BZOJ 1180: [CROATIAN2009]OTOCI [LCT]
1180: [CROATIAN2009]OTOCI Time Limit: 50 Sec Memory Limit: 162 MBSubmit: 961 Solved: 594[Submit][S ...