病毒侵袭持续中

http://acm.hdu.edu.cn/showproblem.php?pid=3065

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

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中推测。

 
 
这道题目是多组数据输入,题目中没有说明,注意一下

if(ss[i]>'Z'||ss[i]<'A') //这一句很重要
//原因有如下2点
//1、trie开到27,如果字符不在A——Z会使trie越界
//2、不在A——Z内,下一个符合条件的就要从头匹配,root置为1,否则可能超时
{
root=1;continue;
}

这里不需要mark数组,因为 统计出现次数,就要重复走

mark是为了防止重复经过一个节点,所以在判断单词是否出现的时候用

#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#include<vector>
using namespace std;
int n,len,tot=;
char s[][],ss[];
int trie[][],f[];
queue<int>q;
int v[];
int use[];
void insert(int k)
{
int root=;len=strlen(s[k]);
for(int i=;i<len;i++)
{
int id=s[k][i]-'A'+;
if(!trie[root][id]) trie[root][id]=++tot;
root=trie[root][id];
}
v[root]=k;
}
void getfail()
{
for(int i=;i<=;i++) trie[][i]=;
q.push();
while(!q.empty())
{
int now=q.front();
for(int i=;i<=;i++)
{
if(!trie[now][i]) continue;
q.push(trie[now][i]);
int j=f[now];
while(!trie[j][i]) j=f[j];
f[trie[now][i]]=trie[j][i];
}
q.pop();
}
}
void work()
{
len=strlen(ss);
int root=;
for(int i=;i<len;i++)
{
if(ss[i]>'Z'||ss[i]<'A') //这一句很重要
//原因有如下2点
//1、trie开到27,如果字符不在A——Z会使trie越界
//2、不在A——Z内,下一个符合条件的就要从头匹配,root置为1,否则可能超时
{
root=;continue;
}
int id=ss[i]-'A'+;
while(!trie[root][id]) root=f[root];
root=trie[root][id];
int j=root;
while(j)
{
if(v[j]) use[v[j]]++;
j=f[j];
}
}
for(int i=;i<=n;i++)
if(use[i])
printf("%s: %d\n",s[i],use[i]);
}
void pre()
{
tot=;
memset(trie,,sizeof(trie));
memset(f,,sizeof(f));
memset(v,,sizeof(v));
memset(use,,sizeof(use));
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
pre();
for(int i=;i<=n;i++)
{
scanf("%s",s[i]);
insert(i);
}
getfail();
scanf("%s",ss);
work();
} }

hdu 3065病毒侵袭持续中的更多相关文章

  1. HDU 3065 病毒侵袭持续中

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

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

    题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=3065 Problem Description 小t非常感谢大家帮忙攻克了他的上一个问题.然而病毒侵袭 ...

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

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

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

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

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

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

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

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

  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自动机)题解

    题意:要你找到主串中每个模式串的个数. 思路:题目都没说是多组数据,结果没while(~)直接WA了,和上一题差不多,可以用map或者开个数组储存.指针要记得回收内存,不然MLE. #include& ...

随机推荐

  1. nginx配置hls

    备注:本来是想用浏览器播放hls,后来没有成功,最后使用flash播放rtmp的方案.所以下面的配置未使用. 修改/usr/local/nginx/conf/nginx.conf文件内容如下: wor ...

  2. 消息队列第一篇:MessageQueue介绍

    消息队列有哪些好处或功能: 1.消息可以在断开连接的环境下发送.不需要同时运行正在发送和正在接收的应用程序. 2.使用快捷模式,消息可以非常快地发送.在快捷模式下,消息存储在内存中. 3.对于可恢复的 ...

  3. C/C++ 打印文件名、行号、函数名的方法

    转自:http://zhidao.baidu.com/link?url=JLCaxBAXLJVcx_8jsyJVF92E_bZjo4ONJ5Ab-HGlNBc1dfzcAyFAIygwP1qr18aa ...

  4. Enterprise Library 6.0 参考源码索引

    http://www.projky.com/entlib/6.0/Diagnostics/Tracing/DiaLib.cs.htmlhttp://www.projky.com/entlib/6.0/ ...

  5. 『编程题全队』Alpha 阶段冲刺博客Day2

    1.每日站立式会议 1.会议照片 2.昨天已完成的工作统计 孙志威:   确定了本阶段的团队目标   确定了个人所分配的任务(主要为客户端GUI模块) 孙慧君:    确定了自己的任务,并着手开始环境 ...

  6. By.cssSelector定位元素一个不足发现

     这个如果用cssSelector定位,代码如下,此时输出的数值是0 System.out.println(driver.findElements(By.cssSelector("div[c ...

  7. laravel中的Contracts, ServiceContainer, ServiceProvider, Facades关系

    Contracts, ServiceContainer, ServiceProvider, Facades  Contracts 合同,契约,也就是接口,定义一些规则,每个实现此接口的都要实现里面的方 ...

  8. ACM数论之旅9---中国剩余定理(CRT)(壮哉我大中华╰(*°▽°*)╯)

    中国剩余定理,又名孙子定理o(*≧▽≦)ツ 能求解什么问题呢? 问题: 一堆物品 3个3个分剩2个 5个5个分剩3个 7个7个分剩2个 问这个物品有多少个 解这题,我们需要构造一个答案 我们需要构造这 ...

  9. https和http/2

    http://geek.csdn.net/news/detail/188003 HTTPS协议原理分析 HTTPS协议需要解决的问题 HTTPS作为安全协议而诞生,那么就不得不面对以下两大安全问题: ...

  10. [BZOJ2095][Poi2010]Bridges 最大流(混合图欧拉回路)

    2095: [Poi2010]Bridges Time Limit: 10 Sec  Memory Limit: 259 MB Description YYD为了减肥,他来到了瘦海,这是一个巨大的海, ...