UVALive-4670 Dominating Patterns(AC自动机)
题目大意:找出出现次数最多的模式串。
题目分析:AC自动机裸题。
代码如下:
# include<iostream>
# include<cstdio>
# include<map>
# include<queue>
# include<cstring>
# include<algorithm>
using namespace std; const int N=20000; int ch[N][26];
string p[155];
char s[N*50+5];
int val[N];
int t[155];
int f[N+5];
int last[N+5];
map<string,int>mp;
map<int,string>mpp; struct AC
{
int cnt;
void init()
{
cnt=0;
memset(val,0,sizeof(val));
memset(ch,0,sizeof(ch));
memset(t,0,sizeof(t));
} void insert(string str,int v)
{
int n=str.size();
int root=0;
for(int i=0;i<n;++i){
int c=str[i]-'a';
if(!ch[root][c])
ch[root][c]=++cnt;
root=ch[root][c];
}
val[cnt]=v;
} void getFail()
{
queue<int>q;
f[0]=0;
for(int i=0;i<26;++i){
int u=ch[0][i];
if(!u) continue;
f[u]=0;
q.push(u);
last[u]=0;
}
while(!q.empty()){
int r=q.front();
q.pop();
for(int i=0;i<26;++i){
int u=ch[r][i];
if(!u) continue;
q.push(u);
int v=f[r];
while(v&&!ch[v][i]) v=f[v];
f[u]=ch[v][i];
last[u]=val[f[u]]?f[u]:last[f[u]];
}
}
} void ac(char *s)
{
int n=strlen(s);
int j=0;
for(int i=0;i<n;++i){
int c=s[i]-'a';
while(j&&!ch[j][c]) j=f[j];
j=ch[j][c];
if(val[j]) getResult(j);
else if(last[j]) getResult(last[j]);
}
} void getResult(int u)
{
if(u==0) return ;
if(u) ++t[val[u]];
getResult(last[u]);
}
}ac; int main()
{
int n;
while(~scanf("%d",&n)&&n)
{
ac.init();
int cnt=0;
mp.clear();
mpp.clear();
for(int i=0;i<n;++i){
cin>>p[i];
if(mp[p[i]]==0) mp[p[i]]=++cnt;
ac.insert(p[i],cnt);
mpp[cnt]=p[i];
}
scanf("%s",s); ac.getFail();
ac.ac(s);
int maxn=0;
for(int i=1;i<=cnt;++i)
maxn=max(maxn,t[i]);
cout<<maxn<<endl;
for(int i=1;i<=cnt;++i)
if(t[i]==maxn) cout<<mpp[i]<<endl;
}
return 0;
}
UVALive-4670 Dominating Patterns(AC自动机)的更多相关文章
- UVALive 4670 Dominating Patterns --AC自动机第一题
题意:多个模板串,一个文本串,求出那些模板串在文本串中出现次数最多. 解法:AC自动机入门模板题. 代码: #include <iostream> #include <cstdio& ...
- UVALive - 4670 Dominating Patterns AC 自动机
input n 1<=n<=150 word1 word2 ... wordn 1<=len(wirdi)<=70 s 1<=len(s)<=1000000 out ...
- LA 4670 Dominating Patterns (AC自动机)
题意:给定一个一篇文章,然后下面有一些单词,问这些单词在这文章中出现过几次. 析:这是一个AC自动机的裸板,最后在匹配完之后再统计数目就好. 代码如下: #pragma comment(linker, ...
- 【暑假】[实用数据结构]UVAlive 4670 Dominating Patterns
UVAlive 4670 Dominating Patterns 题目: Dominating Patterns Time Limit: 3000MS Memory Limit: Unkn ...
- UVALive 4670 Dominating Patterns (AC自动机)
AC自动机的裸题.学了kmp和Trie以后不难看懂. 有一些变化,比如0的定义和f的指向,和建立失配边,以及多了后缀连接数组last.没有试过把失配边直接当成普通边(一开始还是先这样写吧). #inc ...
- uvalive 4670 Dominating Patterns
在文本串中找出现次数最多的子串. 思路:AC自动机模板+修改一下print函数. #include<stdio.h> #include<math.h> #include< ...
- UVa1449 - Dominating Patterns(AC自动机)
题目大意 给定n个由小写字母组成的字符串和一个文本串T,你的任务是找出那些字符串在文本中出现的次数最多 题解 一个文本串,多个模式串,这刚好是AC自动机处理的问题 代码: #include <i ...
- UVa 1449 - Dominating Patterns (AC自动机)
题目大意:给出多个字符串模板,并给出一个文本串,求在文本串中出现最多的模板,输出最多的次数并输出该模板(若有多个满足,则按输入顺序输出). 思路:赤裸裸的 AC自动机,上模板. 代码: #includ ...
- LA4670 Dominating Patterns AC自动机模板
Dominating Patterns 每次看着别人的代码改成自己的模板都很头大...空间少了个0卡了好久 裸题,用比map + string更高效的vector代替蓝书中的处理方法 #include ...
- UVa Live 4670 Dominating Patterns - Aho-Corasick自动机
题目传送门 快速的通道I 快速的通道II 题目大意 给定一堆短串,和一个文本串,问哪些短串在文本串中出现的次数最多. 我觉得刘汝佳的做法,时间复杂度有问题.只是似乎这道题短串串长太短不好卡.比如给出的 ...
随机推荐
- Map-Reduce的工作机制
Mapper “Map-Reduce”的思想就是“分而治之” Mapper负责“分”,即把复杂的任务分解为若干个“简单的任务”而执行 “简单的任务”有几个意思:1.数据或计算规模相对于原任务要大大缩小 ...
- 转 Learning To Rank之LambdaMART的前世今生
http://blog.csdn.net/huagong_adu/article/details/40710305
- Listview没有优化之前
MainActivity.java package com.example.listviewdemo4; import java.util.ArrayList; import java.util.Ha ...
- javascript 变量声明有var与无var 的区别
1.在函数作用域内 加var定义的变量是局部变量,不加var定义的就成了全局变量.使用var定义var a = 'hello World';function bb(){var a = 'hello B ...
- 表设计VIso
- STL源码分析《4》----Traits技术
在 STL 源码中,到处可见 Traits 的身影,其实 Traits 不是一种语法,更确切地说是一种技术. STL库中,有一个函数叫做 advance, 用来将某个迭代器(具有指针行为的一种 cla ...
- 前端开发者应该知道的 CSS 小技巧
一些小技巧让你的CSS技术更专业 使用:not()去除导航上不需要的边框 为body添加行高 垂直居中任何元素 逗号分离的列表 使用负nth-child选择元素 使用SVG图标 文本显示优化 在纯CS ...
- BigBlueButton的安装
下来VM文件,打开系统后 sudo apt-get updatesudo apt-get upgradesudo apt-get dist-upgrade sudo apt-get install b ...
- Smart20学习记录----异步通知
异步通知: 阻塞与非阻塞访问.poll()函数提供了较好地解决设备访问的机制(应用程序主动访问) 异步通知:一旦设备就绪,则主动通知应用程序,这样应用程序根本就不需要查询设备状态,这一点非常类似于硬件 ...
- magento转移服务器和magento建立多站点总结
magento转移服务器和magento建立多站点总结第一. 我们首先要做的就是把服务器上的magento转移到本地上来.详细步骤:1. 直接用magento的备份系统把网上数据库备份.如图:2. 数 ...