病毒侵袭持续中

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

分析:这题和hdu 2896差不多,只是多输出了每个病毒出现的次数,用一个cnt数组记录一下次数即可。
#include<cstdio>
#include<cstring>
using namespace std;const int kind = 26; //有多少种字符
const int N = 1005;
const int M = 2000005;
struct node
{node *next[kind];node *fail;int id;//病毒编号node() {for(int i = 0; i < kind; i++)next[i] = NULL;fail = NULL;id = 0;}
}*q[51*N];
node *root;
int head, tail;
char source[M], s[M];
char vir[N][55];
int cnt[N];void Insert(char *str, int id)
{node *p = root;int i = 0, index;while(str[i]) {index = str[i] - 'A';if(p->next[index] == NULL)p->next[index] = new node();p = p->next[index];i++;}p->id = id;
}
void build_ac_automation(node *root)
{root->fail = NULL;q[tail++] = root;node *p = NULL;while(head < tail) {node *temp = q[head++];for(int i = 0; i < kind; i++) {if(temp->next[i] != NULL) {if(temp == root) temp->next[i]->fail = root;else {p = temp->fail;while(p != NULL) {if(p->next[i] != NULL) {temp->next[i]->fail = p->next[i];break;}p = p->fail;}if(p == NULL) temp->next[i]->fail = root;}q[tail++] = temp->next[i];}}}
}
void Query(char *str)
{int i = 0, index;node *p = root;while(str[i]) {index = str[i] - 'A';while(p->next[index] == NULL && p != root) p = p->fail;p = p->next[index];if(p == NULL) p = root;node *temp = p;while(temp != root && temp->id > 0) {cnt[temp->id]++;temp = temp->fail;}i++;}
}int main()
{int n;while(~scanf("%d",&n)) {memset(cnt, 0, sizeof(cnt));head = tail = 0;root = new node();for(int i = 1; i <= n; i++) {scanf("%s", vir[i]);Insert(vir[i], i);}build_ac_automation(root);scanf("%s",source);int len = strlen(source);int l = 0;for(int i = 0; i <= len; i++) {if(source[i] >= 'A' && source[i] <= 'Z') //因为病毒中只有大写字母,所以只处理连续的大写字母组成的字符串s[l++] = source[i];else {s[l] = '\0';Query(s);l = 0;}}for(int i = 1; i <= n; i++)if(cnt[i])printf("%s: %d\n",vir[i], cnt[i]);}return 0;
}

hdu 3065 病毒侵袭持续中(AC自动机)相关推荐

  1. HDU 3065病毒侵袭持续中 AC自动机

    题意很明了,就是找每个匹配串在文本中出现的次数,并且根据题意可以可以有重复部分. 所以这个题与板子不同的地方就是查找的一部分. 还有就是多组输入!!! /*┆ ┏┓ ┏┓ ┆┆┏┛┻━━━━━━┛┻┓ ...

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

    题目链接:点击查看 题目大意:给出 n 个模式串和一个文本串,问每个模式串在文本串中分别出现了多少次 题目分析:虽然暴跳fail也是可以实现这个题目的,但个人感觉更好的方法还是建立fail树后在树上d ...

  3. HDU-3065 病毒侵袭持续中 AC自动机又是一板子!

    病毒侵袭持续中 上一题是求出现多少病毒输出病毒序号,而这题输出每个病毒出现的次数.这题有字典树基础都能做出来,把叶子节点用相应的编号标记起来,匹配的时候遍历到叶子节点用一个数组把次数存起来就行了. 有 ...

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

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

  5. BNUOJ 7178 病毒侵袭持续中

    病毒侵袭持续中 Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on HDU. Original ID: 30 ...

  6. 病毒侵袭持续中(HDU-3065)

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

  7. hdu 2896 病毒侵袭(AC自动机)

    病毒侵袭                                                                           Time Limit: 2000/1000 ...

  8. HDU 2896 病毒侵袭 AC自动机

    我表示不是很懂HDU卡内存的优良传统.......以及他们卡输出的良好风尚........ AC自动机裸体关键在于http://ascii.911cha.com/ #include<cstrin ...

  9. HDU 2896 病毒侵袭(AC自动机/模板题)

    传送门 病毒侵袭 Time Limit: 2000/1000 MS (Java/Others)            Memory Limit: 131072/131072 K (Java/Other ...

最新文章

  1. python-jsonrpc框架实现JsonRPC协议的web服务
  2. visual studio学习python_一步一步学Python3(小学生也适用) 第三篇: Visual Studio Code
  3. 从 DevOps 到 Serverless
  4. idea整合mybatis错误
  5. 用asp.net画饼图
  6. Linux中su和sudo的用法整理
  7. C眼看J - 初窥JAVA
  8. 动手学深度学习(PyTorch实现)(十二)--批量归一化(BatchNormalization)
  9. 构成网络的多台计算机其硬件配置必须相同吗,计算机省一级2014年-2016年章节试题(答案).docx...
  10. Android xmlns 的作用及其自定义
  11. 五一新闻回顾:XP SP3悄发布 微软雅虎终谈崩
  12. Promise机制(持续更新中)
  13. 西农 生成树配置_配置STP功能
  14. oracle 结构化语言查询 DML DDL DCL
  15. HDU 3996 Gold Mine【最大闭合权图】
  16. NVIDIA Jetson TK1学习与开发——手动刷机
  17. #1.从学生表中查询所有学生的所有信息SELECT * FROM `student`#2.从学生表查询所有学生的学号姓名信息并分别赋予别名SELECT StudentNo AS ‘学号‘, St
  18. HIFI音频解码芯片ES9023
  19. PhpExcel 写一个漂亮的表格
  20. 关闭计算机启动程序,电脑开机启动项该怎么关闭?看我如何快速关闭启动项

热门文章

  1. 早期的增长黑客 PayPal 如何在2000年初达到每日7%到10%的营收成长?
  2. [转] Windows Server 2012 Beta Cluster (Hyper-V 3.0)-SMB篇
  3. Flutter React编程范式实践
  4. 使用PowerDesigner 设计SQL Server 数据库
  5. 翻动100万级的数据
  6. 为什么一定要好好睡觉?
  7. 新手可以做的ai比赛:亲测有效
  8. 其实大学老师在剑桥读博士,好像录取不难
  9. ssh 错误: ssh_exchange_identification
  10. HU 3496 Watch The Movie---二维费用