博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【AC自动机】Lougu P3796
阅读量:4966 次
发布时间:2019-06-12

本文共 1484 字,大约阅读时间需要 4 分钟。

题目描述

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

输入输出格式

输入格式:

输入含多组数据。

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

接下去NNN行,每行一个长度小于等于707070的模式串。下一行是一个长度小于等于10610^6106的文本串TTT。

输入结束标志为N=0N=0N=0。

输出格式:

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

输入输出样例

输入样例#1:
2abababababababac6betaalphahahadeltadedetatadedeltalphahahahototatalpha0
输出样例#1:
4aba2alphahaha

题解

写个AC自动机的板子上来。。。

反正就是先建一棵trie树,然后bfs找失配指针(类似KMP)。。。

然后再在上面搞些奇奇怪怪的东西。。。

代码

//by 减维#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long#define maxn 1000005using namespace std;struct trie{ int end,fail,to[26]; void cle(){ memset(to,0,sizeof(to)); end=fail=0; }}ac[maxn];struct anss{ int pos,num;}ans[maxn];int n,tot;string s[155];bool cmp(const anss&x,const anss&y){ if(x.num==y.num)return x.pos
y.num;}void build(int x){ int now=0,ch; int len=s[x].length(); for(int i=0;i
q; for(int i=0;i<26;++i) if(ac[0].to[i])q.push(ac[0].to[i]),ac[ac[0].to[i]].fail=0; while(!q.empty()) { int d=q.front(); q.pop(); for(int i=0;i<26;++i) { int dd=ac[d].to[i]; if(dd)ac[dd].fail=ac[ac[d].fail].to[i],q.push(dd); else ac[d].to[i]=ac[ac[d].fail].to[i]; } }}void ask(){ int now=0,ch; int len=s[0].length(); for(int i=0;i
>s[i]; build(i); ans[i].pos=i; ans[i].num=0; } getf(); cin>>s[0]; ask(); }}

 

转载于:https://www.cnblogs.com/rir1715/p/8006600.html

你可能感兴趣的文章
MyEclipse连接SQL Server 2008数据库的操作方法
查看>>
SqlCel 和MySQL for Excel在批量处理数据上的优劣
查看>>
leetcode【67】-Bulb Switcher
查看>>
JS验证图片格式和大小并预览
查看>>
调节心态的十种做法
查看>>
laravel5.2 移植到新服务器上除了“/”路由 ,其它路由对应的页面显示报404错误(Object not found!)———新装的LAMP没有加载Rewrite模块...
查看>>
潜罪犯
查看>>
编写高质量代码--改善python程序的建议(六)
查看>>
windows xp 中的administrator帐户不在用户登录内怎么解决?
查看>>
[spfa] Jzoj P4722 跳楼机
查看>>
代码审计入门后审计技巧
查看>>
Linux-Rsync服务器/客户端搭建实战
查看>>
接口和抽象类有什么区别
查看>>
简单通过百度api自动获取定位-前端实现
查看>>
180117 我的宠物识别判断语句
查看>>
JavaScript修炼之道pdf
查看>>
自己动手构造编译系统++编译、汇编与链接pdf
查看>>
JAVA 中文件读写函数BufferedReader 和 BufferedWriter 的使用
查看>>
Codeforces Round #206 (Div. 2)
查看>>
提升混合应用页面打开速度的新思路
查看>>