UVa 1449 - Dominating Patterns (AC自动机)
题目大意:给出多个字符串模板,并给出一个文本串,求在文本串中出现最多的模板,输出最多的次数并输出该模板(若有多个满足,则按输入顺序输出)。
思路:赤裸裸的 AC自动机,上模板。
代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<queue>
#include<algorithm>
#include<cmath>
#include<map>
using namespace std;
#define INF 0x7fffffff
char s[160][80],T[1000010];
int nz,cnt,ch[15000][30],num[160],val[315000];
int f[315000],last[315000];
void insert(char a[],int k){
int i,j,len = strlen(a),u = 0;
for(i=0;i<len;i++){
int v = a[i] - 'a' ;
if(!ch[u][v]){
memset(ch[nz],0,sizeof(ch[nz]));
val[nz]=0;
ch[u][v] = nz++;
}
u = ch[u][v];
}
val[u] = k;
}
void getFail(){
int i;
queue<int> Q;
while(!Q.empty())
Q.pop();
f[0] = 0;
for(i=0;i<26;i++)
if(ch[0][i]){
f[ch[0][i]] = 0;
Q.push(ch[0][i]);
last[ch[0][i]] = 0;
}
while(!Q.empty()){
int r = Q.front();
Q.pop();
for(i=0;i<26;i++){
int v = ch[r][i];
if(v){
Q.push(v);
int p = f[r];
while(p && !ch[p][i])
p = f[p];
f[v] = ch[p][i];
last[v] = val[f[v]] ? f[v] : last[f[v]];
}
}
}
}
void print(int i){
if(i){
// printf("%d ",val[i]);
num[val[i]]++;
print(last[i]);
}
}
void find(){
int i,j;
int len = strlen(T);
int u = 0;
for(i=0;i<len;i++){
int v = T[i] - 'a';
while(u && !ch[u][v]) u = f[u];
u = ch[u][v];
if(val[u]) print(u);
else if(last[u]) print(last[u]);
}
}
int main(){
int n,i,j;
while(scanf("%d",&n) && n){
nz = 1;
memset(val,0,sizeof(val));
memset(ch[0],0,sizeof(ch));
memset(num,0,sizeof(num));
for(i=1;i<=n;i++){
scanf("%s",s[i]);
insert(s[i],i);
}
scanf("%s",T);
getFail();
find();
int MAX = 0;
for(i=1;i<=n;i++)
MAX = max(MAX,num[i]);
printf("%d\n",MAX);
for(i=1;i<=n;i++)
if(num[i] == MAX)
printf("%s\n",s[i]);
}
return 0;
}
UVa 1449 - Dominating Patterns (AC自动机)的更多相关文章
- UVALive 4670 Dominating Patterns --AC自动机第一题
题意:多个模板串,一个文本串,求出那些模板串在文本串中出现次数最多. 解法:AC自动机入门模板题. 代码: #include <iostream> #include <cstdio& ...
- UVa1449 - Dominating Patterns(AC自动机)
题目大意 给定n个由小写字母组成的字符串和一个文本串T,你的任务是找出那些字符串在文本中出现的次数最多 题解 一个文本串,多个模式串,这刚好是AC自动机处理的问题 代码: #include <i ...
- uva 1449 - Dominating Patterns
简单的AC自动机: #include<cstdio> #include<cstring> #include<queue> #define maxn 150005 u ...
- LA 4670 Dominating Patterns (AC自动机)
题意:给定一个一篇文章,然后下面有一些单词,问这些单词在这文章中出现过几次. 析:这是一个AC自动机的裸板,最后在匹配完之后再统计数目就好. 代码如下: #pragma comment(linker, ...
- LA4670 Dominating Patterns AC自动机模板
Dominating Patterns 每次看着别人的代码改成自己的模板都很头大...空间少了个0卡了好久 裸题,用比map + string更高效的vector代替蓝书中的处理方法 #include ...
- UVALive - 4670 Dominating Patterns AC 自动机
input n 1<=n<=150 word1 word2 ... wordn 1<=len(wirdi)<=70 s 1<=len(s)<=1000000 out ...
- UVA 11468 Substring (AC自动机)
用把失配边也加到正常边以后AC自动机,状态是长度递减的DAG,每次选一个不会匹配字符的转移. dp[u][L]表示当前在tire树上u结点长度还剩L时候不匹配的概率,根据全概率公式跑记忆化搜索. #i ...
- UVa Live 4670 Dominating Patterns - Aho-Corasick自动机
题目传送门 快速的通道I 快速的通道II 题目大意 给定一堆短串,和一个文本串,问哪些短串在文本串中出现的次数最多. 我觉得刘汝佳的做法,时间复杂度有问题.只是似乎这道题短串串长太短不好卡.比如给出的 ...
- Dominating Patterns (AC 自动鸡模版题, 出现次数最多的子串)
传送门 题意: 给你n个模式串, 再给你一个 文本串,问模式串在文本串中出现次数最多是多少. 出现次数最多的模式串有哪些. 解: 模版题. #include <bits/stdc++.h> ...
随机推荐
- windows对象总结
这篇文章是对windows对象的总结,在winows编程中,windows对象,句柄是一个基本概念,理解这些概念有助于后面的windows编程学习.文章的形式还是以解答问题的方式来组织. 注:在文中, ...
- Redmine是用Ruby开发的基于web的项目管理软件,是用ROR框架开发的一套跨平台项目管理系统
- Corrupted MAC on input
Corrupted MAC on input Incorrect MAC received on packet
- "V租房"搭建微信租房平台,让租房人发起求租需求并接收合适房源回复,提高租房效率 | 36氪
"V租房"搭建微信租房平台,让租房人发起求租需求并接收合适房源回复,提高租房效率 | 36氪 "V租房"搭建微信租房平台,让租房人发起求租需求并接收合适房源回复 ...
- git 查看文件修改记录
今天追了个几年前留下来的坑, 在 git 里追溯修改过程坑死个爹, 具体方法估计没多久又会忘, 还是记下来以后有的参考 大部分教程都会告诉大家使用 git log 来查看对应文件的修改记录, 就像这样 ...
- android开发学习 几个有用的学习资料~
<Android高级应用开发-基础篇> 针对Android基础入门课程,包含了Android四大件基础.UI,Launcher等等.这个课程学习之后也是进一步深入的基础. <Andr ...
- Struts分页
1.分页的bean类PaginationSupport.java 2.写好后直接在action里面调用,计算当前页显示的数据 3.写一个公用的jsp页面,直接在需要分页的页面include就可以了 ...
- 为iPhone 6设计自适应布局
Apple从iOS 6加入了Auto Layout后开始就比较委婉的开始鼓励.建议开发者使用自适应布局,但是到目前为止,我感觉大多数开发者一直在回避这个问题,不管是不是由于历史原因造成的,至少他们在心 ...
- android 新浪微博客户端的表情功能的实现
这是一篇好文章,我转来收藏,技术的最高境界是分享. 最近在搞android 新浪微博客户端,有一些心得分享弄android客户端表情功能可以用以下思路1.首页把新浪的表情下载到本地一文件夹种,表情图片 ...
- 使用CMD连接SQL Server
在CMD中操作数据库,界面不美观,而且排版不整齐,但在机器上没有安装SQLSERVER的时候,也是极其方便的. 在命令行中输入 OSQL ?可以获得所有帮助信息 osql -S 数据库服务 ...