hdu 3065 病毒侵袭持续中(AC自动机)
病毒侵袭持续中
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
接下来N行,每行表示一个病毒特征码,特征码字符串长度在1—50之间,并且只包含“英文大写字符”。任意两个病毒特征码,不会完全相同。
在这之后一行,表示“万恶之源”网站源码,源码字符串长度在2000000之内。字符串中字符都是ASCII码可见字符(不包括回车)。
病毒特征码: 出现次数
冒号后有一个空格,按病毒特征码的输入顺序进行输出。
Hit: 题目描述中没有被提及的所有情况都应该进行考虑。比如两个病毒特征码可能有相互包含或者有重叠的特征码段。 计数策略也可一定程度上从Sample中推测。
#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自动机)相关推荐
- HDU 3065病毒侵袭持续中 AC自动机
题意很明了,就是找每个匹配串在文本中出现的次数,并且根据题意可以可以有重复部分. 所以这个题与板子不同的地方就是查找的一部分. 还有就是多组输入!!! /*┆ ┏┓ ┏┓ ┆┆┏┛┻━━━━━━┛┻┓ ...
- HDU - 3065 病毒侵袭持续中(AC自动机)
题目链接:点击查看 题目大意:给出 n 个模式串和一个文本串,问每个模式串在文本串中分别出现了多少次 题目分析:虽然暴跳fail也是可以实现这个题目的,但个人感觉更好的方法还是建立fail树后在树上d ...
- HDU-3065 病毒侵袭持续中 AC自动机又是一板子!
病毒侵袭持续中 上一题是求出现多少病毒输出病毒序号,而这题输出每个病毒出现的次数.这题有字典树基础都能做出来,把叶子节点用相应的编号标记起来,匹配的时候遍历到叶子节点用一个数组把次数存起来就行了. 有 ...
- HDU 3065 病毒侵袭持续中(AC自动机)题解
题意:要你找到主串中每个模式串的个数. 思路:题目都没说是多组数据,结果没while(~)直接WA了,和上一题差不多,可以用map或者开个数组储存.指针要记得回收内存,不然MLE. #include& ...
- BNUOJ 7178 病毒侵袭持续中
病毒侵袭持续中 Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on HDU. Original ID: 30 ...
- 病毒侵袭持续中(HDU-3065)
Problem Description 小t非常感谢大家帮忙解决了他的上一个问题.然而病毒侵袭持续中.在小t的不懈努力下,他发现了网路中的"万恶之源".这是一个庞大的病毒网站,他有 ...
- hdu 2896 病毒侵袭(AC自动机)
病毒侵袭 Time Limit: 2000/1000 ...
- HDU 2896 病毒侵袭 AC自动机
我表示不是很懂HDU卡内存的优良传统.......以及他们卡输出的良好风尚........ AC自动机裸体关键在于http://ascii.911cha.com/ #include<cstrin ...
- HDU 2896 病毒侵袭(AC自动机/模板题)
传送门 病毒侵袭 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Other ...
最新文章
- python-jsonrpc框架实现JsonRPC协议的web服务
- visual studio学习python_一步一步学Python3(小学生也适用) 第三篇: Visual Studio Code
- 从 DevOps 到 Serverless
- idea整合mybatis错误
- 用asp.net画饼图
- Linux中su和sudo的用法整理
- C眼看J - 初窥JAVA
- 动手学深度学习(PyTorch实现)(十二)--批量归一化(BatchNormalization)
- 构成网络的多台计算机其硬件配置必须相同吗,计算机省一级2014年-2016年章节试题(答案).docx...
- Android xmlns 的作用及其自定义
- 五一新闻回顾:XP SP3悄发布 微软雅虎终谈崩
- Promise机制(持续更新中)
- 西农 生成树配置_配置STP功能
- oracle 结构化语言查询 DML DDL DCL
- HDU 3996 Gold Mine【最大闭合权图】
- NVIDIA Jetson TK1学习与开发——手动刷机
- #1.从学生表中查询所有学生的所有信息SELECT * FROM `student`#2.从学生表查询所有学生的学号姓名信息并分别赋予别名SELECT StudentNo AS ‘学号‘, St
- HIFI音频解码芯片ES9023
- PhpExcel 写一个漂亮的表格
- 关闭计算机启动程序,电脑开机启动项该怎么关闭?看我如何快速关闭启动项
热门文章
- 早期的增长黑客 PayPal 如何在2000年初达到每日7%到10%的营收成长?
- [转] Windows Server 2012 Beta Cluster (Hyper-V 3.0)-SMB篇
- Flutter React编程范式实践
- 使用PowerDesigner 设计SQL Server 数据库
- 翻动100万级的数据
- 为什么一定要好好睡觉?
- 新手可以做的ai比赛:亲测有效
- 其实大学老师在剑桥读博士,好像录取不难
- ssh 错误: ssh_exchange_identification
- HU 3496 Watch The Movie---二维费用