病毒侵袭

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

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
 
 
AC自动机模板题
 
 
  1. //============================================================================
  2. // Name : HDU.cpp
  3. // Author :
  4. // Version :
  5. // Copyright : Your copyright notice
  6. // Description : Hello World in C++, Ansi-style
  7. //============================================================================
  8.  
  9. #include <stdio.h>
  10. #include <string.h>
  11. #include <iostream>
  12. #include <algorithm>
  13. #include <queue>
  14. using namespace std;
  15.  
  16. struct Trie
  17. {
  18. int next[*][],fail[*],end[*];
  19. int root,L;
  20. int newnode()
  21. {
  22. for(int i = ;i < ;i++)
  23. next[L][i] = -;
  24. end[L++] = -;
  25. return L-;
  26. }
  27. void init()
  28. {
  29. L = ;
  30. root = newnode();
  31. }
  32. void insert(char s[],int id)
  33. {
  34. int len = strlen(s);
  35. int now = root;
  36. for(int i = ;i < len;i++)
  37. {
  38. if(next[now][s[i]] == -)
  39. next[now][s[i]] = newnode();
  40. now=next[now][s[i]];
  41. }
  42. end[now]=id;
  43. }
  44. void build()
  45. {
  46. queue<int>Q;
  47. fail[root] = root;
  48. for(int i = ;i < ;i++)
  49. if(next[root][i] == -)
  50. next[root][i] = root;
  51. else
  52. {
  53. fail[next[root][i]] = root;
  54. Q.push(next[root][i]);
  55. }
  56. while(!Q.empty())
  57. {
  58. int now = Q.front();
  59. Q.pop();
  60. for(int i = ;i < ;i++)
  61. if(next[now][i] == -)
  62. next[now][i] = next[fail[now]][i];
  63. else
  64. {
  65. fail[next[now][i]] = next[fail[now]][i];
  66. Q.push(next[now][i]);
  67. }
  68. }
  69. }
  70. bool used[];
  71. bool query(char buf[],int n,int id)
  72. {
  73. int len = strlen(buf);
  74. int now = root;
  75. memset(used,false,sizeof(used));
  76. bool flag = false;
  77. for(int i = ;i < len;i++)
  78. {
  79. now = next[now][buf[i]];
  80. int temp = now;
  81. while(temp != root)
  82. {
  83. if(end[temp] != -)
  84. {
  85. used[end[temp]] = true;
  86. flag = true;
  87. }
  88. temp = fail[temp];
  89. }
  90. }
  91. if(!flag)return false;
  92. printf("web %d:",id);
  93. for(int i = ;i <= n;i++)
  94. if(used[i])
  95. printf(" %d",i);
  96. printf("\n");
  97. return true;
  98. }
  99. };
  100. char buf[];
  101. Trie ac;
  102. int main()
  103. {
  104. int n,m;
  105. while(scanf("%d",&n) != EOF)
  106. {
  107. ac.init();
  108. for(int i = ;i <= n;i++)
  109. {
  110. scanf("%s",buf);
  111. ac.insert(buf,i);
  112. }
  113. ac.build();
  114. int ans = ;
  115. scanf("%d",&m);
  116. for(int i = ;i <= m;i++)
  117. {
  118. scanf("%s",buf);
  119. if(ac.query(buf,n,i))
  120. ans++;
  121. }
  122. printf("total: %d\n",ans);
  123. }
  124. return ;
  125. }
 
 

HDU 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. hdu 2896 病毒侵袭_ac自动机

    题意:略 思路:套用ac自动机模板 #include <iostream> #include<cstdio> #include<cstring> using nam ...

  6. HDU 2896 病毒侵袭 AC自己主动机题解

    本题是在text里面查找key word的增强版.由于这里有多个text. 那么就不能够简单把Trie的叶子标志记录改动成-1进行加速了,能够使用其它技术.我直接使用个vis数组记录已经訪问过的节点, ...

  7. HDU 2896 病毒侵袭(AC自动机水)

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

  8. HDU 2896 病毒侵袭【AC自动机】

    <题目链接> Problem Description 当太阳的光辉逐渐被月亮遮蔽,世界失去了光明,大地迎来最黑暗的时刻....在这样的时刻,人们却异常兴奋——我们能在有生之年看到500年一 ...

  9. hdu2896 病毒侵袭 ac自动机

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

随机推荐

  1. python to be linux daemon

    所需第三方库:python-daemon[https://pypi.python.org/pypi/python-daemon/] 使用方式: python linux_service.py star ...

  2. 基于Hadoop 2.6.0运行数字排序的计算

    上个博客写了Hadoop2.6.0的环境部署,下面写一个简单的基于数字排序的小程序,真正实现分布式的计算,原理就是对多个文件中的数字进行排序,每个文件中每个数字占一行,排序原理是按行读取后分块进行排序 ...

  3. 50道java算法题(一)

    [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析:   兔子的规律为数列1 ...

  4. 省市县联动dropdownlist

    下面就是在提交按钮的单击事件中填写代码(代码区)(前提是把省市县的数据库建好) protected void Page_Load(object sender, EventArgs e)         ...

  5. Python批量修改文件名-后缀

    LyncLynn用途: 批量修改文件格式,文件名后缀. #Version: V1.0 #Author:lynclynn #Description:Change the filename #Create ...

  6. yum简单安装salt master与minion

    首先得先安装epel的yum源: rpm -ivh http://mirrors.skyshe.cn/epel/6/x86_64/epel-release-6-8.noarch.rpm 1.SaltS ...

  7. algorithm 中的常用函数

    非修改性序列操作(12个) 循环         对序列中的每个元素执行某操作         for_each() 查找         在序列中找出某个值的第一次出现的位置         fin ...

  8. JSP公用COMMON文件

    head.jsp: <meta http-equiv="Content-Type" content="text/html; charset=utf-8" ...

  9. java常用工具类(java技术交流群57388149)

    package com.itjh.javaUtil;   import java.util.ArrayList; import java.util.List;   /** * * String工具类. ...

  10. 解决Eclipse里Maven工程报 An error occurred while filtering resources错误

    这几天被maven的单元测试折腾死了,以为是自己的eclipse有问题呢,今天早上来了又发现eclipse报了一个很奇怪的错误:An error occurred while filtering re ...