题目描述

有N个由小写字母组成的模式串以及一个文本串T。每个模式串可能会在文本串中出现多次。你需要找出哪些模式串在文本串T中出现的次数最多。

输入输出格式

输入格式:

输入含多组数据。

每组数据的第一行为一个正整数N,表示共有N个模式串,1≤N≤150。

接下去N行,每行一个长度小于等于707070的模式串。下一行是一个长度小于等于10^6的文本串T。

输入结束标志为N=0。

输出格式:

对于每组数据,第一行输出模式串最多出现的次数,接下去若干行每行输出一个出现次数最多的模式串,按输入顺序排列。

输入输出样例

输入样例#1:
复制

2
aba
bab
ababababac
6
beta
alpha
haha
delta
dede
tata
dedeltalphahahahototatalpha
0
输出样例#1: 复制

4
aba
2
alpha
haha

题解

以为加强版会卡时间结果连register都没加就很宽裕的过去了QAQ

这里是简单版的题解

然后加强版就只是有一丢丢不一样?都说不上有升级叭QAQ

 /*
qwerta
P3796 【模板】AC自动机(加强版)
Accepted
100
代码 C++,2.32KB
提交时间 2018-10-07 21:48:13
耗时/内存
2264ms, 3096KB
*/
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
const int lenN=*+;
const int lenT=1e6+;
struct emm{
int fail;
int nxt[];
int tag;
}AC[lenN];//Tree结构体
string s[];
string st,t;
queue<int>q;
struct ahh{
int v,nod;
}b[];
bool cmp(ahh qaq,ahh qwq){
if(qaq.v==qwq.v)return qaq.nod<qwq.nod;
return qaq.v>qwq.v;
}
int main()
{
//freopen("a.in","r",stdin);
ios::sync_with_stdio(false);
cin.tie(false),cout.tie(false);
while()
{
int n;
cin>>n;
if(n==)return ;
memset(AC,,sizeof(AC));
//trie
int cnt=;
for(int w=;w<=n;++w)
{
cin>>st;
int len=st.length();
int now=;
for(int i=;i<len;++i)
{
if(!AC[now].nxt[st[i]-'a'])
AC[now].nxt[st[i]-'a']=++cnt;
now=AC[now].nxt[st[i]-'a'];
}
AC[now].tag=w;//记录是第几个数组的结尾
s[w]=st;
}
//get_fail
{
for(int i=;i<;++i)
if(AC[].nxt[i])
{
AC[AC[].nxt[i]].fail=;
q.push(AC[].nxt[i]);
}
while(!q.empty())
{
int x=q.front();q.pop();
for(int i=;i<;++i)
{
if(AC[x].nxt[i])
{
AC[AC[x].nxt[i]].fail=AC[AC[x].fail].nxt[i];
q.push(AC[x].nxt[i]);
}
else
AC[x].nxt[i]=AC[AC[x].fail].nxt[i];
}
}
}
//run
{
memset(b,,sizeof(b));
for(int i=;i<=n;++i)
b[i].nod=i;
cin>>t;
int len=t.length();
int now=;
for(int i=;i<len;++i)
{
now=AC[now].nxt[t[i]-'a'];
for(int u=now;u;u=AC[u].fail)
if(AC[u].tag)
{
b[AC[u].tag].v++;
}
}
//然后是一些奇奇怪怪的句子来输出答案
sort(b+,b+n+,cmp);
cout<<b[].v<<endl;
int k=;
while(b[k].v==b[].v)
{
cout<<s[b[k].nod]<<endl;
k++;
}
}
}
return ;
}

「LuoguP3796」 【模板】AC自动机(加强版)的更多相关文章

  1. LG2444/BZOJ2938 「POI2000」病毒 AC自动机

    问题描述 LG2444 BZOJ2938 I \(\mathrm{AC}\)自动机 \(\mathrm{AC}\)自动机是一种多模式串匹配算法,本萌新今天刚学了它qwq 约定在构造\(\mathrm{ ...

  2. luoguP3796[模板]AC自动机(加强版)

    传送门 ac自动机模板,可能我写的ac自动机是有点问题的,所以跑的有些慢 暴力跳fail统计 代码: #include<cstdio> #include<iostream> # ...

  3. luoguP3808[模板]AC自动机(简单版)

    传送门 ac自动机模板题,裸的多串匹配 代码: #include<cstdio> #include<iostream> #include<algorithm> #i ...

  4. 算法模板——AC自动机

    实现功能——输入N,M,提供一个共计N个单词的词典,然后在最后输入的M个字符串中进行多串匹配(关于AC自动机算法,此处不再赘述,详见:Aho-Corasick 多模式匹配算法.AC自动机详解.考虑到有 ...

  5. 模板 AC自动机

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

  6. 算法竞赛模板 AC自动机

    AC自动机基本操作 (1) 在AC自动机中,我们首先将每一个模式串插入到Trie树中去,建立一棵Trie树,然后构建fail指针. (2) fail指针,是穿插在Trie树中各个结点之间的指针,顾名思 ...

  7. [模板][P3796]AC自动机(加强版)

    Description: 输出有哪些模式串在文本串中出现次数最多,这个次数是多少 Hint: 多组数据,$ len_{文本串}<=10^6,\sum len_{模式串} <= 70*150 ...

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

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

  9. LOJ 3055 「HNOI2019」JOJO—— kmp自动机+主席树

    题目:https://loj.ac/problem/3055 先写了暴力.本来想的是 n<=300 的那个在树上暴力维护好整个字符串, x=1 的那个用主席树维护好字符串和 nxt 数组.但 x ...

随机推荐

  1. 如何将MID音乐转换成MP3

    1 使用Direct MIDI to MP3 Converter这个软件,你可以从下面这个网站下载:http://www.hanzify.org/index.php?Go=Show::List& ...

  2. window.open 打开子窗体,关闭全部的子窗体

    需求:通过window.open方法打开了子窗体,当关闭主窗体时.子窗体应当也关闭. 实现思路: 1.打开子窗体函数window.open(url,winName)的第二个參数winName能够唯一标 ...

  3. Solaris shell脚本学习

    看懂脚本文件即可 知识点: Shell概述 Shell变量 Shell中的特殊字符 参数置换变量 控制结构 何为shell Shell就是unix提供给用户的使用界面,处于内核和应用程序之间,他是一个 ...

  4. Foundation框架 - NSException类

    NSException类 WBStudentManager.h #import <Foundation/Foundation.h> NSString* const NameInvalidE ...

  5. DB 【ACID】

    http://blog.csdn.net/shuaihj/article/details/14163713 http://blog.csdn.net/dief913975849/article/det ...

  6. WPF03(样式)

    说起样式,大家第一反应肯定是css,好的,先上一段代码. 1 html{border:0;} 2 ul,form{margin:0; padding:0} 3 body,div,th,td,li,dd ...

  7. kubernetes故障现场一之Orphaned pod

    系列目录 问题描述:周五写字楼整体停电,周一再来的时候发现很多pod的状态都是Terminating,经排查是因为测试环境kubernetes集群中的有些节点是PC机,停电后需要手动开机才能起来.起来 ...

  8. javascript中提高代码的封装性

    我出的面试题中,有一条是问如何避免页面引用JS,出现函数.变量重复.冲突的. 从大的方面讲,应该引入javascript的模块化开发,符合AMD规范之类: 从小的方面说,大概就是限定变量和函数的作用域 ...

  9. php 实现简单加入购物车

    今天在练习购物车以及提交订单,写的有点头晕,顺便也整理一下,这个购物车相对来说比较简单,用于短暂存储,并没有存储到数据库, 购物车对于爱网购的人来说简直是熟悉的不能再熟悉了,在写购物车之前,我们首先要 ...

  10. java object monitor

    1 什么是java object monitor 每个java对象头中都有锁状态位标记.java中在使用synchronize同步的时候,肯定是涉及到某个对象的锁.因此,在考虑同步的时候,首先要想到是 ...