题目大意:找出出现次数最多的模式串。

题目分析: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自动机)的更多相关文章

  1. UVALive 4670 Dominating Patterns --AC自动机第一题

    题意:多个模板串,一个文本串,求出那些模板串在文本串中出现次数最多. 解法:AC自动机入门模板题. 代码: #include <iostream> #include <cstdio& ...

  2. UVALive - 4670 Dominating Patterns AC 自动机

    input n 1<=n<=150 word1 word2 ... wordn 1<=len(wirdi)<=70 s 1<=len(s)<=1000000 out ...

  3. LA 4670 Dominating Patterns (AC自动机)

    题意:给定一个一篇文章,然后下面有一些单词,问这些单词在这文章中出现过几次. 析:这是一个AC自动机的裸板,最后在匹配完之后再统计数目就好. 代码如下: #pragma comment(linker, ...

  4. 【暑假】[实用数据结构]UVAlive 4670 Dominating Patterns

    UVAlive 4670 Dominating Patterns 题目:   Dominating Patterns   Time Limit: 3000MS   Memory Limit: Unkn ...

  5. UVALive 4670 Dominating Patterns (AC自动机)

    AC自动机的裸题.学了kmp和Trie以后不难看懂. 有一些变化,比如0的定义和f的指向,和建立失配边,以及多了后缀连接数组last.没有试过把失配边直接当成普通边(一开始还是先这样写吧). #inc ...

  6. uvalive 4670 Dominating Patterns

    在文本串中找出现次数最多的子串. 思路:AC自动机模板+修改一下print函数. #include<stdio.h> #include<math.h> #include< ...

  7. UVa1449 - Dominating Patterns(AC自动机)

    题目大意 给定n个由小写字母组成的字符串和一个文本串T,你的任务是找出那些字符串在文本中出现的次数最多 题解 一个文本串,多个模式串,这刚好是AC自动机处理的问题 代码: #include <i ...

  8. UVa 1449 - Dominating Patterns (AC自动机)

    题目大意:给出多个字符串模板,并给出一个文本串,求在文本串中出现最多的模板,输出最多的次数并输出该模板(若有多个满足,则按输入顺序输出). 思路:赤裸裸的 AC自动机,上模板. 代码: #includ ...

  9. LA4670 Dominating Patterns AC自动机模板

    Dominating Patterns 每次看着别人的代码改成自己的模板都很头大...空间少了个0卡了好久 裸题,用比map + string更高效的vector代替蓝书中的处理方法 #include ...

  10. UVa Live 4670 Dominating Patterns - Aho-Corasick自动机

    题目传送门 快速的通道I 快速的通道II 题目大意 给定一堆短串,和一个文本串,问哪些短串在文本串中出现的次数最多. 我觉得刘汝佳的做法,时间复杂度有问题.只是似乎这道题短串串长太短不好卡.比如给出的 ...

随机推荐

  1. Oracle中varchar,varchar2,nvarchar,nvarchar2的区别

    --varchar,varchar2 联系:1.varchar/varchar2用于存储可变长度的字符串比如varchar(20),存入字符串'abc',则数据库中该字段只占3个字节,而不是20个字节 ...

  2. DotNetBar v12.7.0.10 Fully Cracked

    更新信息: http://www.devcomponents.com/customeronly/releasenotes.asp?p=dnbwf&v=12.7.0.10 如果遇到破解问题可以与 ...

  3. SSH(2)-- ssh_config和sshd_config

    假定服务器ip为192.168.1.139,ssh服务的端口号为22,服务器上有个用户为pi,两边都是ubuntu. ssh_config和sshd_config都是ssh服务器的配置文件,二者区别在 ...

  4. (转) mysql的连接,创建账号,修改密码

    原文:http://blog.chinaunix.net/uid-20749043-id-1878306.html  mysql的连接,创建账号,修改密码 2008-10-13 15:31:29 分类 ...

  5. git vs svn

    http://www.tuicool.com/articles/e2MnAb Git与SVN的不同之处 svn为集中化的版本控制,svn获取最新的版本或者提交更新,历史记录等信息每次都要连接中央版本库 ...

  6. 使用Wireshark捕捉USB通信数据

    USB,是英文Universal Serial Bus(通用串行总线)的缩写,而其中文简称为“通串线”,是一个外部总线标准,用于规范电脑与外部设备的连接和通讯.USB接口支持设备的即插即用和热插拔功能 ...

  7. 并非然并卵的z-index

    最近做一些东西的时候总觉得加上z-index和不加对于最终的显示结果并没有什么区别,开始以为一张图片把z-inde的值调小一点儿,就可以当做背景图片一样使用,跟background是一样的,在试过几次 ...

  8. Add a stylesheet link programmatically in ASP.NET

    Here’s a code snippet used to programmatically insert a stylesheet link to an external CSS file: // ...

  9. PHP中使用的变量

    变量是用于临时的存储值的容器.这些值可以是数字.文本,或者复杂得多的排列组合. 变量在任何编程语言中都居于核心地位,理解它们是使用PHP的关键所在.变量又是指在程序的运行过程中随时可以发生变化的量,是 ...

  10. linux命令:ls

    1.介绍: ls是linux日常操作中用的最多命令,是list的缩写,默认按名称排序列出当前目录和文件,ls --help可以查看帮助. 2.命令格式: ls [OPTION] [FILE] 3.命令 ...