zoukankan      html  css  js  c++  java
  • 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 }
    未来是什么样,未来会发生什么,谁也不知道。 但是我知道, 起码从今天开始努力, 肯定比从明天开始努力, 要快一天实现梦想。 千里之行,始于足下! ——《那年那兔那些事儿》
  • 相关阅读:
    [bzoj1731] [Usaco2005 dec]Layout 排队布局
    [bzoj1914] [Usaco2010 OPen]Triangle Counting 数三角形
    [bzoj1774] [Usaco2009 Dec]Toll 过路费
    [bzoj1783] [Usaco2010 Jan]Taking Turns
    [bzoj1705] [Usaco2007 Nov]Telephone Wire 架设电话线
    [bzoj1700]: [Usaco2007 Jan]Problem Solving 解题
    定时启动任务
    数据库表转javaBean
    验证码的生成
    MD5加密与验证
  • 原文地址:https://www.cnblogs.com/keximeiruguo/p/7342201.html
Copyright © 2011-2022 走看看