Description:

输出有哪些模式串在文本串中出现次数最多,这个次数是多少

Hint:

多组数据,$ len_{文本串}<=10^6,\sum len_{模式串} <= 70*150 $

Solution:

模板题,详见代码

// luogu-judger-enable-o2
#include<bits/stdc++.h>
using namespace std;
const int mxn=2e6+5;
char p[160][80],str[mxn];
int n,st[mxn],vis[mxn],ans[mxn];
queue<int > q; namespace Trie {
int mx,tot,cnt,fail[mxn],col[mxn],t[mxn][26];
void clear(int x) {
for(int i=0;i<26;++i) t[x][i]=0;
fail[x]=col[x]=0;
}
void ins(char *s,int id) {
int len=strlen(s),u=0;
for(int i=0;i<len;++i) {
if(!t[u][s[i]-'a']) t[u][s[i]-'a']=++tot,clear(tot);
u=t[u][s[i]-'a'];
}
col[u]=id;
}
void build() {
for(int i=0;i<26;++i)
if(t[0][i]) fail[t[0][i]]=0,q.push(t[0][i]);
while(!q.empty()) {
int u=q.front(); q.pop();
for(int i=0;i<26;++i) {
if(t[u][i]) fail[t[u][i]]=t[fail[u]][i],q.push(t[u][i]);
else t[u][i]=t[fail[u]][i];
}
}
}
int query(char *s) {
int len=strlen(s),u=0;
for(int i=0;i<len;++i) {
u=t[u][s[i]-'a'];
for(int v=u;v;v=fail[v]) {
if(col[v]!=0)
++ans[col[v]];
if(ans[col[v]]>mx) cnt=0,mx=ans[col[v]];
if(ans[col[v]]==mx) st[++cnt]=col[v];
}
}
return mx;
}
}
using namespace Trie; int main()
{
while(1) {
clear(0);
for(int i=1;i<=tot;++i) fail[i]=ans[i]=st[i]=col[i]=0;
mx=0,cnt=0,tot=0;
scanf("%d",&n);
if(n==0) break;
for(int i=1;i<=n;++i) scanf("%s",p[i]);
scanf("%s",str);
for(int i=1;i<=n;++i)
ins(p[i],i); build();
printf("%d\n",query(str));
sort(st+1,st+cnt+1);
for(int i=1;i<=cnt;++i)
cout<<p[st[i]]<<endl;
} return 0;
}

[模板][P3796]AC自动机(加强版)的更多相关文章

  1. 【模板】AC自动机加强版

    题目大意:给定 N 个模式串和一个文本串,求每个模式串在文本串中出现的次数. 题解:文本串在自动机上匹配的过程中,记录下自动机上每一个状态被访问的次数.对于访问到的节点 i,则状态 i 的后缀中存在的 ...

  2. P3796 【模板】AC自动机(加强版)

    P3796 [模板]AC自动机(加强版) https://www.luogu.org/problemnew/show/P3796 题目描述 有NN个由小写字母组成的模式串以及一个文本串TT.每个模式串 ...

  3. 【题解】P3796【模板】AC自动机(加强版)

    [题解]P3796 [模板]AC自动机(加强版) 记录当前\(cnt\)是第几个"星".记录第几个串是对应着第几个星. 这里补充一点对于\(AC\)自动机的理解.可能一直有个问题我 ...

  4. 洛谷P3796 - 【模板】AC自动机(加强版)

    原题链接 Description 模板题啦~ Code //[模板]AC自动机(加强版) #include <cstdio> #include <cstring> int co ...

  5. 洛谷 P3796 【模板】AC自动机(加强版)(AC自动机)

    题目链接:https://www.luogu.com.cn/problem/P3796 AC自动机:复杂度$O( (N+M)\times L )$,N为模式串个数,L为平均长度,M为文章长度. ins ...

  6. 「LuoguP3796」 【模板】AC自动机(加强版)

    题目描述 有N个由小写字母组成的模式串以及一个文本串T.每个模式串可能会在文本串中出现多次.你需要找出哪些模式串在文本串T中出现的次数最多. 输入输出格式 输入格式: 输入含多组数据. 每组数据的第一 ...

  7. 模板】AC自动机(简单版)

    模板]AC自动机(简单版) https://www.luogu.org/problemnew/show/P3808 这是一道简单的AC自动机模板题. 用于检测正确性以及算法常数. 为了防止卡OJ,在保 ...

  8. 【学时总结&模板时间】◆学时·10 & 模板·3◆ AC自动机

    ◇学时·10 & 模板·3◇ AC自动机 跟着高中上课……讲AC自动机的扩展运用.然而连KMP.trie字典树都不怎么会用的我一脸懵逼<(_ _)> 花一上午自学了一下AC自动机 ...

  9. 模板—字符串—AC自动机(多模式串,单文本串)

    模板—字符串—AC自动机(多模式串,单文本串) Code: #include <queue> #include <cstdio> #include <cstring> ...

随机推荐

  1. oracle数据库自增主键重复

    select max(t.id) from T_PLAT_ENUM_VALUE tdrop sequence T_PLAT_ENUM_VALUE;create sequence T_PLAT_ENUM ...

  2. HTML学习笔记07-头部

    HTML <head> 元素 <head> 元素包含了所有的头部标签元素.在 <head>元素中你可以插入脚本(scripts), 样式文件(CSS),及各种met ...

  3. Innodb ,MyISAM

    1. InnoDB不支持FULLTEXT类型的索引. 2. InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算 ...

  4. appium运行报错java.net.SocketException: socket write error

    这个错我调了 快两天一点头绪没有,脚本正常跑没问题,但是就是控制台输出信息报错,没法定位问题在哪.报错如图: 虽然这个报错不影响测试结果,但是本人有强迫症,一定要查出究竟: 我的尝试: 1.那天试验, ...

  5. Windows Mac地址伪装步骤

    本文介绍Windows上Mac地址修改方法,适用于网络环境绑定了Mac地址需要修改上网的情况. 工具/原料 PC电脑一台 Windows系统 方法/步骤 点击右下角图标. 点击打开网络和共享中心. 点 ...

  6. InterruptedException 异常

    当一个方法后面声明可能会抛出InterruptedException 异常时,说明该方法是可能会花一点时间,但是可以取消的方法. 抛InterruptedException的代表方法有: 1. jav ...

  7. tcpdump使用示例

    前言 这段时间一直在研究kubernetes当中的网络, 包括通过keepalived来实现VIP的高可用时常常不得不排查一些网络方面的问题, 在这里顺道梳理一下tcpdump的使用姿势, 若有写的不 ...

  8. python 全栈开发,Day111(客户管理之 编辑权限(二),Django表单集合Formset,ORM之limit_choices_to,构造家族结构)

    昨日内容回顾 1. 权限系统的流程? 2. 权限的表有几个? 3. 技术点 中间件 session orm - 去重 - 去空 inclusion_tag filter 有序字典 settings配置 ...

  9. Type in Chakra

    Type in Chakra Javascript是一个无类型的语言. 我们要讨论的类型是指Chakra内置的一些数据结构,这些结构维护了Object的信息. Type在一类Object中共享数据,使 ...

  10. 跨域资源共享CORS

    CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing).它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而 ...