HDU 3065 病毒侵袭持续中(AC自己主动机)
题目链接:http://acm.hdu.edu.cn/showproblem.php?
pid=3065
接下来N行。每行表示一个病毒特征码。特征码字符串长度在1—50之间,而且仅仅包括“英文大写字符”。
随意两个病毒特征码。不会全然同样。
在这之后一行,表示“万恶之源”站点源代码,源代码字符串长度在2000000之内。字符串中字符都是ASCII码可见字符(不包含回车)。
病毒特征码: 出现次数
冒号后有一个空格。按病毒特征码的输入顺序进行输出。
3
AA
BB
CC
ooxxCC%dAAAoen....END
AA: 2
CC: 1HintHit:
题目描写叙述中没有被提及的全部情况都应该进行考虑。 比方两个病毒特征码可能有相互包括或者有重叠的特征码段。
计数策略也可一定程度上从Sample中猜測。
代码例如以下:
#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自己主动机)的更多相关文章
- hdu 3056 病毒侵袭持续中 AC自己主动机
http://acm.hdu.edu.cn/showproblem.php?pid=3065 刘汝佳的模板真的非常好用,这道题直接过 学到: cnt数组记录单词出现次数 以及map存储单词编号与字符串 ...
- HDU 3065 病毒侵袭持续中 (AC自动机)
题目链接 Problem Description 小t非常感谢大家帮忙解决了他的上一个问题.然而病毒侵袭持续中.在小t的不懈努力下,他发现了网路中的"万恶之源".这是一个庞大的病毒 ...
- HDU 3065 病毒侵袭持续中
HDU 3065 病毒侵袭持续中 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- hdu 3065 病毒侵袭持续中【AC自动机】
<题目链接> 题目大意: 小t非常感谢大家帮忙解决了他的上一个问题.然而病毒侵袭持续中.在小t的不懈努力下,他发现了网路中的“万恶之源”.这是一个庞大的病毒网站,他有着好多好多的病毒,但是 ...
- hdu 3065病毒侵袭持续中
病毒侵袭持续中 http://acm.hdu.edu.cn/showproblem.php?pid=3065 Time Limit: 2000/1000 MS (Java/Others) Mem ...
- HDU 3065 病毒侵袭持续中 (模板题)
病毒侵袭持续中 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- hdu 3065病毒侵袭持续中(ac自动机)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=3065 中文题题意不解释了. 依旧稍微改一下ac自动机模版就能过了.还有一个坑点!是多组数据!!! #i ...
- HDU 3065 病毒侵袭持续中(AC自动机)
这题数据太水,一开始没有加上Get的方法也能AC..话说AC自动机中一定要注意加上Get的方法!(不然,同一个后缀的其他单词就没被算上了.) 代码如下: #include <stdio.h> ...
- HDU 3065 病毒侵袭持续中(AC自动机(每个模式串出现次数))
http://acm.hdu.edu.cn/showproblem.php?pid=3065 题意:求每个模式串出现的次数. 思路: 不难,把模板修改一下即可. #include<iostrea ...
随机推荐
- shell 几中专用修饰符 :- :+ := ${variable:offset:length}
1.${variable:-word} ${variable:-word} 如果variable已经被设置了,且不为空,则代入它的值,否则代入word; $ fruit=peach $ echo ${ ...
- OpennSSL之基本了解
HTTPS是一种协议,等于HTTP+TLS(由于历史原因,SSL3.0之后就被TLS1.0替代了).openssl是一套开源工具集,主要有两个特性: 实现了ssl2,ssl3,TLSv1,TLSv1. ...
- 【01】如何在XMind中排列自由主题
如何在XMind中一招排列自由主题 在XMind思维导图软件中,用户可以随心所欲的添加自由主题,但由于自由主题的灵活性,造成了它的不整齐性,相对需要操持界面排列有序的用户来说,会造成一定的困扰. 第一 ...
- iphone数据库(sqlite3)的用法操作oc,xcode
首先你在用之前要在项目中加入libsqlite3.dylib 1.定义模型 [cpp] #import <Foundation/Foundation.h> #import " ...
- vim 第三章 插入模式
vim 第三章 插入模式 在普通模式下可以删除 复制 及粘贴的命令 在插入模式下也存在以中方便快捷的方式 能够粘贴寄存器中文本 两种方式来插入键盘上不存在的非常用字符 替换模式 ...
- Laya list 居中
1.将list放在一个box中,去除box的宽高,设其锚点为0.5,0.5 2.将box的锚点放到目标位置 3.在list渲染后,设定box的宽度为list的宽度
- XML文件中<return_code><![CDATA[SUCCESS]]></return_code>中CDATA的用法
转义字符不合法的XML字符必须被替换为相应的实体. 如果在XML文档中使用类似"<" 的字符, 那么解析器将会出现错误,因为解析器会认为这是一个新元素的开始.所以不应该象下面 ...
- ajax dome案例
一.首先HTML页面 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...
- 算法复习——高斯消元(ssoi)
题目: 题目描述 Tom 是个品学兼优的好学生,但由于智商问题,算术学得不是很好,尤其是在解方程这个方面.虽然他解决 2x=2 这样的方程游刃有余,但是对于下面这样的方程组就束手无策了.x+y=3x- ...
- 【bzoj1483】[HNOI2009]梦幻布丁 set
[bzoj1483][HNOI2009]梦幻布丁 Description N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1,2 ...