HDU-2896 病毒侵袭(AC自动姬)

病毒侵袭

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


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
 
Recommend
gaojie   |   We have carefully selected several similar problems for you:  3065 2243 2825 3341 3247 
 
这个垃圾题目搞了老子半天都说是访问越界,去你妈的访问越界,老子写个AC自动姬容易么我,真是……反正我是半点问题都没看出来
  1 #include "bits/stdc++.h"
  2 using namespace std;
  3 typedef long long LL;
  4 const int MAX1=100005;
  5 const int MAX2=10004;
  6 int n,m;
  7 bool t[505],flag;
  8 struct Aho{
  9     struct Trie{
 10         int next[26];
 11         int cnt,fail;
 12     }sst[MAX1];
 13     
 14     queue <int> q;
 15     int size,tot;
 16     
 17     void init(){
 18         int i,j;
 19         while (q.size()) q.pop();
 20         for (i=0;i<MAX1;i++){
 21             memset(sst[i].next,0,sizeof(sst[i].next));
 22             sst[i].cnt=sst[i].fail=0;
 23         }
 24         tot=size=0;
 25     }
 26     
 27     void insert(char *s){
 28         int i,j,ls=strlen(s);
 29         int now=0;
 30         for (i=0;i<ls;i++){
 31             char c=s[i];
 32             if (!sst[now].next[c-'a']) sst[now].next[c-'a']=++size;
 33             now=sst[now].next[c-'a'];
 34         }
 35         sst[now].cnt=++tot;
 36     }
 37     
 38     void build(){
 39         int i,j;
 40         sst[0].fail=-1;
 41         q.push(0);
 42         while (q.size()){
 43             int u=q.front();
 44             q.pop();
 45             for (i=0;i<26;i++){
 46                 if (sst[u].next[i]){
 47                     if (u==0) sst[sst[u].next[i]].fail=0;
 48                     else{
 49                         int v=sst[u].fail;
 50                         while (v!=-1){
 51                             if (sst[v].next[i]){
 52                                 sst[sst[u].next[i]].fail=sst[v].next[i];
 53                                 break;
 54                             }
 55                             v=sst[v].fail;
 56                         }
 57                         if (v==-1) sst[sst[u].next[i]].fail=0;
 58                     }
 59                     q.push(sst[u].next[i]);
 60                 }
 61             }
 62         }
 63     }
 64     
 65     void search(char *s){
 66         int i,j,ls=strlen(s);
 67         int now=0;
 68         for (i=0;i<ls;i++){
 69             char c=s[i];
 70             if (sst[now].next[c-'a']) now=sst[now].next[c-'a'];
 71             else{
 72                 int p=sst[now].fail;
 73                 while (p!=-1 && !sst[p].next[c-'a']) p=sst[p].fail;
 74                 if (p==-1) now=0;
 75                 else now=sst[p].next[c-'a'];
 76             }
 77             if (sst[now].cnt){
 78                 t[sst[now].cnt]=true;
 79                 flag=true;
 80             }
 81         }
 82     }
 83 }aho;
 84 int main(){
 85     freopen ("virus.in","r",stdin);
 86     freopen ("virus.out","w",stdout);
 87     int i,j,tol=0;
 88     char s[MAX2];
 89     scanf("%d
",&n);
 90     aho.init();
 91     for (i=1;i<=n;i++){
 92         gets(s);
 93         aho.insert(s);
 94     }
 95     aho.build();
 96     scanf("%d
",&m);
 97     for (i=1;i<=m;i++){
 98         gets(s);
 99         memset(t,false,sizeof(t));flag=false;
100         aho.search(s);
101         if (flag){
102             printf("web %d: ",i);
103             for (j=1;j<=aho.tot;j++)
104                 if (t[j])
105                     printf("%d ",j);
106                 printf("
");
107             tol++;
108         }
109     }
110     printf("total: %d",tol);
111     return 0;
112 }
未来是什么样,未来会发生什么,谁也不知道。 但是我知道, 起码从今天开始努力, 肯定比从明天开始努力, 要快一天实现梦想。 千里之行,始于足下! ——《那年那兔那些事儿》
原文地址:https://www.cnblogs.com/keximeiruguo/p/7342201.html