HDU2896 病毒侵袭
题目大意:给出若干病毒的特征码,不超过500个。每个病毒的特征码长度在20~200之间。现在有若干网站的源代码,要检测网站的源代码中是否包含病毒。网站的个数不超过1000个,每个网站的源代码长度在7000~10000之间。已知如果包含病毒,最多包含三个病毒。输出每个含病毒网站包含的病毒的编号等信息,最后输出含病毒网站的个数。
裸的AC自动机题目。一开始把病毒的个数弄错了。因为宏定义比较多,一开始没有弄#define,全弄的数字。后边发现数字错了。改了一下,又改漏了一个。后边看别人的discuss,说是什么连续不重复匹配。结果完全是误导人。就是一个普通的字符串匹配。以后还是用宏来定义数组长度吧
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define MAXC 130
struct node
{
int id,fail,nxt[MAXC];
}trie[];
char word[],web[];
int head,tail,tot=,root=,myq[],ans[],bdk,n,m,bdwebs=,res[];
void insert(int r,char *s,int id)
{
int len=strlen(s);
for(int i=;i<len;i++)
{
if(trie[r].nxt[s[i]-]==)
trie[r].nxt[s[i]-]=++tot;
r=trie[r].nxt[s[i]-];
}
trie[r].id=id;
}
void build(int r)
{
trie[r].fail=r;
myq[tail++]=r;
while(head<tail)
{
r=myq[head++];
for(int i=;i<MAXC;i++)
{
int ch=trie[r].nxt[i],failp;
if(ch)
{
myq[tail++]=ch;
for(failp=trie[r].fail;failp!=root&&trie[failp].nxt[i]==;failp=trie[failp].fail);
if(trie[failp].nxt[i]==||trie[failp].nxt[i]==ch)
trie[ch].fail=failp;
else
trie[ch].fail=trie[failp].nxt[i];
}
}
}
}
void query(int r,char *s)
{
int len=strlen(s),tempfail;
for(int i=;i<len;i++)
{
while(trie[r].nxt[s[i]-]==&&r!=root)
r=trie[r].fail;
r=trie[r].nxt[s[i]-];
if(r==)r=root;
for(tempfail=r;tempfail!=root;tempfail=trie[tempfail].fail)
{
if(ans[trie[tempfail].id])break;
if(trie[tempfail].id>)
{ans[trie[tempfail].id]=;
}
}
}
}
int main()
{
root=;
scanf("%d",&n);
for(int i=;i<n;i++)
{
scanf("%s",word);
insert(root,word,i+);
}
build(root);
scanf("%d",&m);
for(int i=;i<m;i++)
{
scanf("%s",web);
memset(ans,,sizeof ans);
bdk=;
query(root,web);
for(int k=;k<;k++)
if(ans[k])res[bdk++]=k;
if(bdk>)
{
bdwebs++;
printf("web %d:",i+);
for(int k=;k<bdk;k++)
printf(" %d",res[k]);
printf("\n");
}
}
printf("total: %d\n",bdwebs);
return ;
}
HDU2896 病毒侵袭的更多相关文章
- hdu2896 病毒侵袭 AC自动机入门题 N(N <= 500)个长度不大于200的模式串(保证所有的模式串都不相同), M(M <= 1000)个长度不大于10000的待匹配串,问待匹配串中有哪几个模式串,
/** 题目:hdu2896 病毒侵袭 链接:http://acm.hdu.edu.cn/showproblem.php?pid=2896 题意:N(N <= 500)个长度不大于200的模式串 ...
- HDU2896 病毒侵袭 【AC自动机】
HDU2896 病毒侵袭 Problem Description 当太阳的光辉逐渐被月亮遮蔽,世界失去了光明,大地迎来最黑暗的时刻....在这样的时刻,人们却异常兴奋--我们能在有生之年看到500年一 ...
- HDU2896 病毒侵袭 —— AC自动机
题目链接:https://vjudge.net/problem/HDU-2896 病毒侵袭 Time Limit: 2000/1000 MS (Java/Others) Memory Limit ...
- hdu2896 病毒侵袭 ac自动机
地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=2896 题目: 病毒侵袭 Time Limit: 2000/1000 MS (Java/Othe ...
- HDu-2896 病毒侵袭,AC自动机模板题!
病毒侵袭 模板题,不多说了.. 题意:n个不同的字符串分别代表病毒特征,给出m次查询,每次一个字符串(网址),求这个字符串中有几个病毒特征,分别从大到小输出编号,最后输出所有的带病毒网址个数.格式请看 ...
- HDU-2896 病毒侵袭 字符串问题 AC自动机
题目链接:https://cn.vjudge.net/problem/HDU-2896 题意 中文题 给一些关键词和一个字符串,问字符串里包括了那几种关键词 思路 直接套模版 改insert方法,维护 ...
- hdu2896病毒侵袭(ac自动机)
链接 ac自动机的模板题 说2个注意的地方 一是题目说明包含所有ASCII字符,可以开到0-127 包含空格 题目会输入多个源串,在加完当前的val值时,不应清0,可以开个标记数组. #include ...
- [HDU2896]病毒侵袭(AC自动机)
传送门 题目中文描述,赞! 除了val记录id以外就是模板. 注意:每次数组都要清0.0 ——代码 #include <cstdio> #include <queue> #in ...
- HDU2896 病毒侵袭 AC自动机模板
各种MLE,这模板感觉有问题,next数组开128也会MLE,实际上可见字符为编号32~126,只用开100就行. #include <iostream> #include <cst ...
随机推荐
- renderman、arnold及全局光照
走马观花看了一些实现全局光(global illumination)的文章,都是非实时电影级的.的确可以分为两个阵营,一是pixar的renderman中常用的reyes+点云,感觉pixar一路走来 ...
- Back to openGL!
#include <iostream> #include <windows.h> #include <gl/glut.h> #include <math.h& ...
- softwareTesting_work1
1.12306手机APP软件测评 首先是软件界面,iPhone版本和android版本长得是一模一样,虽然是注重功能的软件,但是一样样的界面让人完全感受不到软件设计者的诚意啊. 还有就是软件图片和图标 ...
- java中与数据库的连接
package unitl01; import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet; ...
- 关于上传app遇到的一些棘手的小问题
最近上传了一个app,由于是第一次上传,花费在这上面的时间不比做app的耗时短啊....说多了都是泪.下面为了不让大家掉坑里去,分享一些小经验: 1.使用别人的开发者账号上传完自己的app(本人暂无开 ...
- js 判断浏览器的类型
function getBrowser() { var Sys = {}; var ua = navigator.userAgent.toLowerCase(); var s; ...
- cnblogs开篇留念
之前看过很多大牛程序员们介绍的一些经验之类的文章,几乎每个人都提到了一点就是平时要写博客,记录一些自己平时学习和工作过程中学习到的一些技术点和心得.之前也用过一些其他的网站博客,上周有同事推荐了一篇文 ...
- Flex 监听浏览器关闭
在creationComplete的事件中,添加如下: if(ExternalInterface.available)//外部接口是否可用 { var js:String= " ...
- php部分---文件上传:错误处理、 客户端和服务器端的限制
1.客户端页面 <!---客户端的配置 1.表单页面 2.表单发送方式为post 3.表单form中添加enctype="multipart/form-data" ----- ...
- WINDOW(单调队列的应用)
给你一个长度为 N 的数组,一个长为 K 的滑动的窗体从最左移至最右端, 你只能见到窗口的K个数,每次窗体向右移动一位,如下表: 你的任务是找出窗口在各位置时的 max value,min value ...