题目链接:http://acm.hdu.edu.cn/showproblem.php?

pid=3065

Problem Description
小t非常感谢大家帮忙攻克了他的上一个问题。然而病毒侵袭持续中。在小t的不懈努力下,他发现了网路中的“万恶之源”。这是一个庞大的病毒站点,他有着好多好多的病毒。可是这个站点包括的病毒非常奇怪,这些病毒的特征码非常短,并且仅仅包括“英文大写字符”。当然小t好想好想为民除害,可是小t从来不打没有准备的战争。知己知彼,百战不殆。小t首先要做的是知道这个病毒站点特征:包括多少不同的病毒,每种病毒出现了多少次。大家能再帮帮他吗?
 
Input
第一行,一个整数N(1<=N<=1000),表示病毒特征码的个数。

接下来N行。每行表示一个病毒特征码。特征码字符串长度在1—50之间,而且仅仅包括“英文大写字符”。

随意两个病毒特征码。不会全然同样。

在这之后一行,表示“万恶之源”站点源代码,源代码字符串长度在2000000之内。字符串中字符都是ASCII码可见字符(不包含回车)。

 
Output
按下面格式每行一个。输出每一个病毒出现次数。未出现的病毒不须要输出。

病毒特征码: 出现次数

冒号后有一个空格。按病毒特征码的输入顺序进行输出。

 
Sample Input
3
AA
BB
CC
ooxxCC%dAAAoen....END
 
Sample Output
AA: 2
CC: 1
Hint
Hit:
题目描写叙述中没有被提及的全部情况都应该进行考虑。 比方两个病毒特征码可能有相互包括或者有重叠的特征码段。
计数策略也可一定程度上从Sample中猜測。
 
Source

代码例如以下:

#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <string.h>
#include <queue>
#include <string>
using namespace std;
char ss[1017][57];
int ans[1017];
struct Trie
{
int next[500010][128],fail[500010],end[500010];
int root,L;
int newnode()
{
for(int i = 0; i < 128; i++)
next[L][i] = -1;
end[L++] = -1;
return L-1;
}
void init()
{
L = 0;
root = newnode();
}
void insert(char buf[], int id)
{
int len = strlen(buf);
int now = root;
for(int i = 0; i < len; i++)
{
if(next[now][buf[i]] == -1)
next[now][buf[i]] = newnode();
now = next[now][buf[i]];
}
end[now] = id;
}
void build()
{
queue<int>Q;
fail[root] = root;
for(int i = 0; i < 128; i++)
if(next[root][i] == -1)
next[root][i] = root;
else
{
fail[next[root][i]] = root;
Q.push(next[root][i]);
}
while(!Q.empty())
{
int now = Q.front();
Q.pop();
for(int i = 0; i < 128; i++)
if(next[now][i] == -1)
next[now][i] = next[fail[now]][i];
else
{
fail[next[now][i]]=next[fail[now]][i];
Q.push(next[now][i]);
}
}
}
void query(char buf[], int n)
{
memset(ans,0,sizeof(ans));
int len = strlen(buf);
int now = root;
for(int i = 0; i < len; i++)
{
now = next[now][buf[i]];
int temp = now;
while( temp != root )
{
//res += end[temp];
//printf("temp:%d end[temp]:%d\n",temp,end[temp]);
if(end[temp] != -1)
{
ans[end[temp]]++;
}
//end[temp] = 0;
temp = fail[temp];
}
}
}
};
char buf[2000010];
Trie ac;
int main()
{
int t, n;
while(~scanf("%d",&n))
{
ac.init();
for(int i = 0; i < n; i++)
{
scanf("%s",ss[i]);
ac.insert(ss[i],i);
}
ac.build();//fail
scanf("%s",buf);
ac.query(buf, n);
for(int i = 0; i < n; i++)
{
if(ans[i])
{
printf("%s: %d\n",ss[i],ans[i]);
}
}
}
return 0;
}

HDU 3065 病毒侵袭持续中(AC自己主动机)的更多相关文章

  1. hdu 3056 病毒侵袭持续中 AC自己主动机

    http://acm.hdu.edu.cn/showproblem.php?pid=3065 刘汝佳的模板真的非常好用,这道题直接过 学到: cnt数组记录单词出现次数 以及map存储单词编号与字符串 ...

  2. HDU 3065 病毒侵袭持续中 (AC自动机)

    题目链接 Problem Description 小t非常感谢大家帮忙解决了他的上一个问题.然而病毒侵袭持续中.在小t的不懈努力下,他发现了网路中的"万恶之源".这是一个庞大的病毒 ...

  3. HDU 3065 病毒侵袭持续中

    HDU 3065 病毒侵袭持续中 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  4. hdu 3065 病毒侵袭持续中【AC自动机】

    <题目链接> 题目大意: 小t非常感谢大家帮忙解决了他的上一个问题.然而病毒侵袭持续中.在小t的不懈努力下,他发现了网路中的“万恶之源”.这是一个庞大的病毒网站,他有着好多好多的病毒,但是 ...

  5. hdu 3065病毒侵袭持续中

    病毒侵袭持续中 http://acm.hdu.edu.cn/showproblem.php?pid=3065 Time Limit: 2000/1000 MS (Java/Others)    Mem ...

  6. HDU 3065 病毒侵袭持续中 (模板题)

    病毒侵袭持续中 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  7. hdu 3065病毒侵袭持续中(ac自动机)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=3065 中文题题意不解释了. 依旧稍微改一下ac自动机模版就能过了.还有一个坑点!是多组数据!!! #i ...

  8. HDU 3065 病毒侵袭持续中(AC自动机)

    这题数据太水,一开始没有加上Get的方法也能AC..话说AC自动机中一定要注意加上Get的方法!(不然,同一个后缀的其他单词就没被算上了.) 代码如下: #include <stdio.h> ...

  9. HDU 3065 病毒侵袭持续中(AC自动机(每个模式串出现次数))

    http://acm.hdu.edu.cn/showproblem.php?pid=3065 题意:求每个模式串出现的次数. 思路: 不难,把模板修改一下即可. #include<iostrea ...

随机推荐

  1. webservice 测试地址

    腾讯QQ在线状态 WEB 服务Endpoint: http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx Disco: http:// ...

  2. 2017-2018 ACM-ICPC, NEERC, Southern Subregional Contest (Online Mirror, ACM-ICPC Rules, Teams Preferred)

    先把代码扔上来 E. Field of Wonders time limit per test 3 seconds memory limit per test 256 megabytes input ...

  3. vamare下centos7.0 动态获取ip报错问题

    CentOS7 Failed to start LSB: Bring up/down解决方法 centos7.0中service network restart重启报错的问题 报错信息: /etc/i ...

  4. vue 使用Echarts 环形图 自定义legend formatter 富文本标签

    main.js 引入echarts // 引入echarts import Echarts from 'echarts' Vue.prototype.$echarts = Echarts   < ...

  5. 关于IOS项目QQ空间授权提示安装最新版本的QQ的解决方法!

  6. RDDs基本操作、RDDs特性、KeyValue对RDDs、RDD依赖

    摘要:RDD是Spark中极为重要的数据抽象,这里总结RDD的概念,基本操作Transformation(转换)与Action,RDDs的特性,KeyValue对RDDs的Transformation ...

  7. Python之回调函数

    在计算机程序设计中,回调函数,或简称回调(Callback),是指通过函数参数传递到其它代码的,某一块可执行代码的引用.这一设计允许了底层代码调用在高层定义的子程序. 有两种类型的回调函数:即bloc ...

  8. 2013   Dhaka 区域赛

    A.uva 12709 Falling ANTS 首先按照H排序,然后按照L*H*W排序 #include<iostream> #include<cstdio> #includ ...

  9. FOJ Problem 2271 X

    Problem 2271 X Accept: 55    Submit: 200Time Limit: 1500 mSec    Memory Limit : 32768 KB Problem Des ...

  10. BZOJ 2973 入门OJ4798 石头游戏

    矩阵递推 #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring ...