hdu----(3065)病毒侵袭持续中(AC自动机)
病毒侵袭持续中
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 6721 Accepted Submission(s): 2372
t非常感谢大家帮忙解决了他的上一个问题。然而病毒侵袭持续中。在小t的不懈努力下,他发现了网路中的“万恶之源”。这是一个庞大的病毒网站,他有着好多
好多的病毒,但是这个网站包含的病毒很奇怪,这些病毒的特征码很短,而且只包含“英文大写字符”。当然小t好想好想为民除害,但是小t从来不打没有准备的
战争。知己知彼,百战不殆,小t首先要做的是知道这个病毒网站特征:包含多少不同的病毒,每种病毒出现了多少次。大家能再帮帮他吗?
接下来N行,每行表示一个病毒特征码,特征码字符串长度在1—50之间,并且只包含“英文大写字符”。任意两个病毒特征码,不会完全相同。
在这之后一行,表示“万恶之源”网站源码,源码字符串长度在2000000之内。字符串中字符都是ASCII码可见字符(不包括回车)。
病毒特征码: 出现次数
冒号后有一个空格,按病毒特征码的输入顺序进行输出。
AA
BB
CC
ooxxCC%dAAAoen....END
CC: 1
Hit:
题目描述中没有被提及的所有情况都应该进行考虑。比如两个病毒特征码可能有相互包含或者有重叠的特征码段。
计数策略也可一定程度上从Sample中推测。
/*hdu 3065 Ac-自动机*/
//#define LOCAL
#include<queue>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
int res;
struct Trie
{
struct Trie *fail;
struct Trie *child[];
int id;
};
char s1[][];
char t1[];
int ans[];
void _insert(char *s,Trie *root,int id) //构造一下rie树
{
Trie *cur=root,*newcur;
for(int i=;s[i];i++)
{
int idx=s[i]-;
if(cur->child[idx]==NULL)
{
newcur=new Trie;
for(int j=;j<;j++)
newcur->child[j]=NULL;
newcur->fail=NULL;
newcur->id=;
cur->child[idx]=newcur;
}
cur=cur->child[idx];
}
cur->id=id;
}
//构造失败指针
void ac_fail(Trie *root)
{
Trie *cur,*q ;
queue<Trie*>tre;
tre.push(root);
while(!tre.empty())
{
cur=tre.front();
tre.pop();
for(int i=;i<;i++)
{
if(cur->child[i])
{
if(cur==root)
cur->child[i]->fail=root;
else
{
q=cur;
while(q->fail){
if(q->fail->child[i])
{
cur->child[i]->fail=q->fail->child[i];
break;
}
q=q->fail;
}
if(!q->fail)
cur->child[i]->fail=root;
}
tre.push(cur->child[i]);
}
}
}
}
//查询
void solve(char *s,Trie *root)
{
Trie *cur=root,*newcur;
for(int i= ; s[i] ;i++ )
{
while(cur->child[s[i]-]==NULL&&cur!=root)
cur=cur->fail;
cur=cur->child[s[i]-];
if(cur==NULL) cur=root;
newcur=cur;
while(newcur!=root&&newcur->id>)
{
ans[newcur->id]++;
newcur=newcur->fail;
}
}
}
void del(Trie *root)
{
if(!root) return ;
for(int i=;i<;i++)
if(root->child[i])
del(root->child[i]);
delete root;
}
void work(int n)
{
for(int i=;i<=n;i++)
if(ans[i]>)
{
printf("%s: %d\n",s1[i],ans[i]);
}
}
int main()
{
#ifdef LOCAL
freopen("test.in","r",stdin);
#endif
int n,i;
while(scanf("%d",&n)!=EOF)
{
Trie *root=new Trie;
for(i=;i<;i++)
root->child[i]=NULL;
root->fail=NULL;
root->id=;
memset(ans,,sizeof(ans));
for(i=;i<=n;i++)
{
scanf("%s",s1[i]);
_insert(s1[i],root,i);
}
ac_fail(root);
scanf("%s",t1);
solve(t1,root);
work(n);
del(root);
}
return ;
}
hdu----(3065)病毒侵袭持续中(AC自动机)的更多相关文章
- HDU 3065 病毒侵袭持续中 (AC自动机)
题目链接 Problem Description 小t非常感谢大家帮忙解决了他的上一个问题.然而病毒侵袭持续中.在小t的不懈努力下,他发现了网路中的"万恶之源".这是一个庞大的病毒 ...
- hdoj 3065 病毒侵袭持续中(AC自动机)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3065 思路分析:问题需要模式匹配多个模式串,需要注意的是模式串会包含和重叠,需要对AC自动机的匹配过 ...
- 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 病毒侵袭持续中(AC自己主动机)
题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=3065 Problem Description 小t非常感谢大家帮忙攻克了他的上一个问题.然而病毒侵袭 ...
- hdu3065 病毒侵袭持续中 AC自动机入门题 N(N <= 1000)个长度不大于50的模式串(保证所有的模式串都不相同), 一个长度不大于2000000的待匹配串,求模式串在待匹配串中的出现次数。
/** 题目:hdu3065 病毒侵袭持续中 链接:http://acm.hdu.edu.cn/showproblem.php?pid=3065 题意:N(N <= 1000)个长度不大于50的 ...
- 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 ...
- HDU3065 病毒侵袭持续中 —— AC自动机
题目链接:https://vjudge.net/problem/HDU-3065 病毒侵袭持续中 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...
随机推荐
- CodeForces 567C Geometric Progression
Geometric Progression Time Limit:1000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I ...
- Cheatsheet: 2013 10.09 ~ 10.23
Other 10 Basic Linux Networking and Monitoring Commands You Should Know A simple, portable yet effic ...
- HTML Meta中添加X-UA-Compatible和IE=Edge,chrome=1有什么作用?
X-UA-Compatible是自从IE8新加的一个设置,对于IE8以下的浏览器是不识别的.通过在meta中设置X-UA-Compatible的值,可以指定网页的兼容性模式设置. 在网页中指定的模式优 ...
- 权威发布:长链非编码RNA命名规则
转自:http://blog.sina.com.cn/s/blog_8088f3700101pab7.html 权威发布:长链非编码RNA命名规则 对于人类基因命名标准的制定而言,雨果基因命名委员会( ...
- [POJ1222]EXTENDED LIGHTS OUT(高斯消元,异或方程组)
题目链接:http://poj.org/problem?id=1222 题意:开关是四连通的,每按一个就会翻转自己以及附近的四个格(假如有).问需要翻转几个,使他们都变成关. 把每一个灯看作一个未知量 ...
- EF实体框架常见问题
1,无法为具有固定名称“System.Data.SqlClient”的 ADO.NET 提供程序加载在应用程序配置文件中注册的实体框架提供程序类型“System.Data.Entity.SqlServ ...
- 学习python得到方向与主体
Python的主体内容大致可以分为以下几个部分: 面向过程.包括基本的表达式,if语句,循环,函数等.如果你有任何一个语言的基础,特别是C语言的基础,这一部分就是分分钟了解下Python规定的事.如果 ...
- 简单几步配置gitlab
简单几步配置gitlab 之前配置gitlab需要很多步骤,要装apache2.ruby.tomcat.mysql等一片东西.有没有更简单的方式呢?现在可以借助bitnami,简化了很多. 可以参考v ...
- IBM Lotus Domino V8.5 服务器管理入门手册
转自 http://freemanluo.blog.51cto.com/636588/336128
- JS完成改变新闻字体大中小的显示
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"% ...