设为首页 加入收藏

TOP

hduoj-----(2896)病毒侵袭(ac自动机)(一)
2015-07-20 17:31:32 来源: 作者: 【 】 浏览:6
Tags:hduoj----- 2896 病毒 侵袭 动机

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
2009 Multi-University Training Contest 10 - Host by NIT
?
ac-自动机
构造trie树,进行失败指针构造(采用队列形式),查询,注意这里的一个小问题:?? Assic码不是仅有字母.....
代码:
? 1 /*hdu 2896 Ac-自动机*/
? 2 //#define LOCAL
? 3 #include
? 4 #include
? 5 #include
? 6 #include
? 7 #include
? 8 #include
? 9 using namespace std;
?10 int res;
?11 struct Trie
?12 {
?13?? struct Trie *fail;
?14?? struct Trie *child[127];
?15?? int id;
?16 };
?17 char s1[205];
?18 char t1[10010];
?19 bool vis[505]; //用来表示是否已经访问
?20 void _insert(char *s,Trie *root,int id)? //构造一下rie树
?21 {
?22???? Trie *cur=root,*newcur;
?23???? for(int i=0;s[i];i++)
?24???? {
?25???????? int idx=s[i]-32;
?26???????? if(cur->child[idx]==NULL)
?27???????? {
?28??????????? newcur=new Trie;
?29?????????? for(int j=0;j<127;j++)
?30????????????? newcur->child[j]=NULL;
?31??????????? newcur->fail=NULL;
?32??????????? newcur->id=0;
?33??????????? cur->child[idx]=newcur;
?34???????? }
?35??????? cur=cur->child[idx];
?36???? }
?37???? cur->id=id;
?38 }
?39? //构造失败指针
?40 void ac_fail(Trie *root)
?41 {
?42?? Trie *cur,*q ;
?43?? queuetre;
?44?? tre.push(root);
?45?? while(!tre.empty())
?46?? {
?47??????? cur=tre.front();
?48??????? tre.pop();
?49???? for(int i=0;i<127;i++)
?50???? {
?51?????? if(cur->child[i])
?52?????? {
?53???????? if(cur==root)
?54?????????? cur->child[i]->fail=root;
?55???????? else
?56???????? {
?57????????????? q=cur;
?58?????????? while(q->fail){
?59???????????? if(q->fail->child[i])
?60???????????? {
?61?????????????? cur->child[i]->fail=q->fail->child[i];
?62?????????????? break;
?63???????????? }
?64??????????? q=q->fail;
?65?????????? }
?66????????? if(!q->fail)
?67??????????? cur->child[i]->fail=root;
?68??????? }
?69?????? tre.push(cur->child[i]);
?70????? }
?71???? }
?72?? }
?73 }
?74 //查询
?75 void solve(char *s,Trie *root,int id)
?76 {
?77?? Trie *cur=root,*newcur;
?78?? int ans[5]={0},t=0;
?79?? for(int i=0 ; s[i] ;i++ )
?80?? {
?81?????? while(cur->child[s[i]-32]==NULL&&cur!=root)
?82???????? cur=cur->fail;
?83????? cur=cur->child[s[i]-32];
?84????? if(cur==NULL) cur=root;
?85????? newcur=cur;
?86????? while(newcur!=root&&newcur->id>0&&vis[newcur->id]==0)
?87????? {
?88??????? ans[t++]=newcur->id;
?89??????? vis[newcur->id]=1;? //表示已经访问了
?90??????? newcur=newcur->fail;
?91????? }
?92?? }
?93?? if(t>0)
?94?? {
?95???? sort(ans,ans+t);
?96???? printf("web %d:",id);
?97???? for(

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Regular Expression Matching 下一篇Effective C++ 26,27,28

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·在 Redis 中如何查看 (2025-12-26 03:19:03)
·Redis在实际应用中, (2025-12-26 03:19:01)
·Redis配置中`require (2025-12-26 03:18:58)
·Asus Armoury Crate (2025-12-26 02:52:33)
·WindowsFX (LinuxFX) (2025-12-26 02:52:30)