病毒侵袭

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 11909    Accepted Submission(s): 3088

Problem Description
当太阳的光辉逐渐被月亮遮蔽,世界失去了光明,大地迎来最黑暗的时刻。。。。在这样的时刻,人们却异常兴奋——我们能在有生之年看到500年一遇的世界奇观,那是多么幸福的事儿啊~~

网路上总有那么些网站,开始借着民众的好奇心,打着介绍日食的旗号,大肆传播病毒。小t不幸成为受害者之一。小t如此生气,他决定要把世界上所有带病毒的
网站都找出来。当然,谁都知道这是不可能的。小t却执意要完成这不能的任务,他说:“子子孙孙无穷匮也!”(愚公后继有人了)。
万事开头难,小t
收集了好多病毒的特征码,又收集了一批诡异网站的源码,他想知道这些网站中哪些是有病毒的,又是带了怎样的病毒呢?顺便还想知道他到底收集了多少带病毒的
网站。这时候他却不知道何从下手了。所以想请大家帮帮忙。小t又是个急性子哦,所以解决问题越快越好哦~~
 
Input
第一行,一个整数N(1<=N<=500),表示病毒特征码的个数。
接下来N行,每行表示一个病毒特征码,特征码字符串长度在20—200之间。
每个病毒都有一个编号,依此为1—N。
不同编号的病毒特征码不会相同。
在这之后一行,有一个整数M(1<=M<=1000),表示网站数。
接下来M行,每行表示一个网站源码,源码字符串长度在7000—10000之间。
每个网站都有一个编号,依此为1—M。
以上字符串中字符都是ASCII码可见字符(不包括回车)。
 
Output
依次按如下格式输出按网站编号从小到大输出,带病毒的网站编号和包含病毒编号,每行一个含毒网站信息。
web 网站编号: 病毒编号 病毒编号 …
冒号后有一个空格,病毒编号按从小到大排列,两个病毒编号之间用一个空格隔开,如果一个网站包含病毒,病毒数不会超过3个。
最后一行输出统计信息,如下格式
total: 带病毒网站数
冒号后有一个空格。
 
Sample Input
3
aaa
bbb
ccc
2
aaabbbccc
bbaacc
 
Sample Output
web 1: 1 2 3
total: 1
 
Source
 
ac-自动机
构造trie树,进行失败指针构造(采用队列形式),查询,注意这里的一个小问题:   Assic码不是仅有字母.....
代码:
 /*hdu 2896 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[];
bool vis[]; //用来表示是否已经访问
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,int id)
{
Trie *cur=root,*newcur;
int ans[]={},t=;
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>&&vis[newcur->id]==)
{
ans[t++]=newcur->id;
vis[newcur->id]=; //表示已经访问了
newcur=newcur->fail;
}
}
if(t>)
{
sort(ans,ans+t);
printf("web %d:",id);
for(int i=;i<t;i++)
printf(" %d",ans[i]);
puts("");
res++;
}
}
void del(Trie *root)
{
if(!root) return ;
for(int i=;i<;i++)
if(root->child[i])
del(root->child[i]);
delete root;
}
int main()
{
#ifdef LOCAL
freopen("test.in","r",stdin);
#endif
int n,m,i;
while(scanf("%d",&n)!=EOF)
{
Trie *root=new Trie;
for(i=;i<;i++)
root->child[i]=NULL;
root->fail=NULL;
root->id=;
for(i=;i<=n;i++)
{
scanf("%s",s1);
_insert(s1,root,i);
}
ac_fail(root);
scanf("%d",&m);
res=;
for(int i=;i<=m;i++)
{
scanf("%s",t1);
memset(vis,,sizeof(vis));
solve(t1,root,i);
}
printf("total: %d\n",res);
del(root);
}
return ;
}

hduoj-----(2896)病毒侵袭(ac自动机)的更多相关文章

  1. hdu 2896 病毒侵袭 ac自动机

    /* hdu 2896 病毒侵袭 ac自动机 从题意得知,模式串中没有重复的串出现,所以结构体中可以将last[](后缀链接)数组去掉 last[]数组主要是记录具有相同后缀模式串的末尾节点编号 .本 ...

  2. hdu 2896 病毒侵袭 AC自动机(查找包含哪些子串)

    病毒侵袭 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  3. hdu 2896 病毒侵袭 AC自动机 基础题

    病毒侵袭 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  4. HDU 2896 病毒侵袭 (AC自己主动机)

    pid=2896">http://acm.hdu.edu.cn/showproblem.php?pid=2896 病毒侵袭 Time Limit: 2000/1000 MS (Java ...

  5. hdu2896 病毒侵袭 ac自动机

    地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=2896 题目: 病毒侵袭 Time Limit: 2000/1000 MS (Java/Othe ...

  6. hdu2896 病毒侵袭 AC自动机入门题 N(N <= 500)个长度不大于200的模式串(保证所有的模式串都不相同), M(M <= 1000)个长度不大于10000的待匹配串,问待匹配串中有哪几个模式串,

    /** 题目:hdu2896 病毒侵袭 链接:http://acm.hdu.edu.cn/showproblem.php?pid=2896 题意:N(N <= 500)个长度不大于200的模式串 ...

  7. 【HDU2896】病毒侵袭 AC自动机

    [HDU2896]病毒侵袭 Problem Description 当太阳的光辉逐渐被月亮遮蔽,世界失去了光明,大地迎来最黑暗的时刻....在这样的时刻,人们却异常兴奋--我们能在有生之年看到500年 ...

  8. HDu-2896 病毒侵袭,AC自动机模板题!

    病毒侵袭 模板题,不多说了.. 题意:n个不同的字符串分别代表病毒特征,给出m次查询,每次一个字符串(网址),求这个字符串中有几个病毒特征,分别从大到小输出编号,最后输出所有的带病毒网址个数.格式请看 ...

  9. HDU2896 病毒侵袭 —— AC自动机

    题目链接:https://vjudge.net/problem/HDU-2896 病毒侵袭 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit ...

随机推荐

  1. SQL分组查询每组前几条数据

    /*第一种实现方法,效率低并且有错误*/ DECLARE @DD DATETIME SET @DD = GETDATE() SELECT a.GoodsID , a.Account , a.LastU ...

  2. css参考文档; 官方英文说明!! 1 margin padding 百分比参照物 2 margin值为auto时的说明 3 div在div里垂直居中方法 4 dispaly:flex说明

    css参考文档        http://css.doyoe.com/ 两篇很好的文章:(下面的css官方英文说明链接 有时间可以研究下 http://www.w3.org/TR/css3-box/ ...

  3. 【转】ffmpeg参数中文详细解释

    感谢“大神”的无私奉献:http://blog.csdn.net/leixiaohua1020/article/details/15811977 a) 通用选项 -L license-h 帮助-fro ...

  4. [转]Jenkins CommonCollections 完美利用(演示)工具

    博主URL:http://tools.changesec.com/Jenkins-CommonCollections-Exploit/ 提交漏洞总是要证明漏洞危害,老外写的java代码又有bug,所以 ...

  5. 购买vps创建账号后无法登录ftp

    购买了vps,并在后台已经开通了ftp账号,但是前台无法登录.错误提示530.解决方法是: 请检查您ftp账号密码是否输入正确,若确认正确,请您ssh登陆服务器,然后执行sh /www/wdlinux ...

  6. SpringMVC 登陆判断

    struts2:extends ActionSupport @Override public String execute() throws Exception { User user = userS ...

  7. Android——android相对布局(RelativeLayout)及属性

    RelativeLayout布局 android:layout_marginTop="25dip" //顶部距离 android:gravity="left" ...

  8. day20 FORM补充(随时更新),F/Q操作,model之多对多,django中间件,缓存,信号

    python-day20 1.FROM生成select标签的数据应该来源于数据库. 2.model 操作 F/Q  (组合查询) 3.model 多对多操作. 4.中间件 :在请求到达url前先会经过 ...

  9. jQuery 中$(this).parent().parent().remove()无效。

    在写文章系统的删除功能.需要删除一行数据.在删除的页面,需要jQuery 删除一hang. 局部刷新数据. $(".del").click(function(){ var id = ...

  10. More Effective C++ (2)

    接下来的是more effective c++ 11至20条款: 11.禁止异常信息(exceptions)传递到析构函数外.析构函数的调用情况可能有两种:(1)对象正常销毁 (2)异常传播过程中的栈 ...