地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=2896

题目:

病毒侵袭

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

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
 
思路:自动机模板题,不过内存卡的蛋疼。。。
  一开始mle,然后我把数组改成short,结果疯狂re,,还一直找不到原因,,,折腾了一个多小时,后来无意之下改成了int后(调整了数组大小)居然ac了,此刻我的内心是崩溃的==
  原来short这么小,哭瞎
 
代码:
 
  1. #include <queue>
  2. #include <cstring>
  3. #include <cstdio>
  4. using namespace std;
  5. struct AC_auto
  6. {
  7. const static int LetterSize = ;
  8. const static int TrieSize = * ;
  9.  
  10. int tot,root,fail[TrieSize],end[TrieSize],next[TrieSize][LetterSize];
  11.  
  12. int newnode(void)
  13. {
  14. memset(next[tot],-,sizeof(next[tot]));
  15. end[tot] = ;
  16. return tot++;
  17. }
  18.  
  19. void init(void)
  20. {
  21. tot = ;
  22. root = newnode();
  23. }
  24.  
  25. int getidx(char x)
  26. {
  27. return (int)x;
  28. }
  29.  
  30. void insert(char *ss,int x)
  31. {
  32. int len = strlen(ss);
  33. int now = root;
  34. for(int i = ; i < len; i++)
  35. {
  36. int idx = getidx(ss[i]);
  37. if(next[now][idx] == -)
  38. next[now][idx] = newnode();
  39. now = next[now][idx];
  40. }
  41. end[now]=x;
  42. }
  43.  
  44. void build(void)
  45. {
  46. queue<int>Q;
  47. fail[root] = root;
  48. for(int i = ; i < LetterSize; i++)
  49. if(next[root][i] == -)
  50. next[root][i] = root;
  51. else
  52. fail[next[root][i]] = root,Q.push(next[root][i]);
  53. while(Q.size())
  54. {
  55. int now = Q.front();Q.pop();
  56. for(int i = ; i < LetterSize; i++)
  57. if(next[now][i] == -) next[now][i] = next[fail[now]][i];
  58. else
  59. fail[next[now][i]] = next[fail[now]][i],Q.push(next[now][i]);
  60. }
  61. }
  62.  
  63. int match(char *ss,int n,int x)
  64. {
  65. int len,now,use[],ff;
  66. memset(use,,sizeof use);
  67. len = strlen(ss),now = root,ff=;
  68. for(int i = ; i < len; i++)
  69. {
  70. int idx = getidx(ss[i]);
  71. int tmp = now = next[now][idx];
  72. while(tmp)
  73. {
  74. if(end[tmp])
  75. use[end[tmp]]=,ff=;
  76. tmp = fail[tmp];
  77. }
  78. }
  79. if(!ff)return ;
  80. printf("web %d:",x);
  81. for(int j=; j<=n; j++)if(use[j])
  82. printf(" %d",j);
  83. printf("\n");
  84. return ;
  85. }
  86.  
  87. };
  88.  
  89. AC_auto ac;
  90. char ss[];
  91. int main(void)
  92. {
  93. int n,m,ans=;
  94. scanf("%d",&n);
  95. ac.init();
  96. for(int i=; i<=n; i++)
  97. scanf("%s",ss),ac.insert(ss,i);
  98. scanf("%d",&m);
  99. ac.build();
  100. for(int i=; i<=m; i++)
  101. {
  102. scanf("%s",ss);
  103. if(ac.match(ss,n,i))
  104. ans++;
  105. }
  106. printf("total: %d\n",ans);
  107. return ;
  108. }

hdu2896 病毒侵袭 ac自动机的更多相关文章

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

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

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

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

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

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

  4. hdu2896病毒侵袭(ac自动机)

    链接 ac自动机的模板题 说2个注意的地方 一是题目说明包含所有ASCII字符,可以开到0-127 包含空格 题目会输入多个源串,在加完当前的val值时,不应清0,可以开个标记数组. #include ...

  5. HDU2896 病毒侵袭 AC自动机模板

    各种MLE,这模板感觉有问题,next数组开128也会MLE,实际上可见字符为编号32~126,只用开100就行. #include <iostream> #include <cst ...

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

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

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

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

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

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

  9. hduoj-----(2896)病毒侵袭(ac自动机)

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

随机推荐

  1. 无线安全审计工具 Fern WiFi Cracker

    使用这款工具前最好自定义一个MAC地址,以便隐藏我们的真实MAC地址信息. 由于Fern WiFi Cracker是图形界面的,不需要敲命令,所以操作起来比Aircrack-ng简单了许多. 首先选择 ...

  2. C/C++构建系统 CMake

    Cmake实践 Cmake Practice –Cjacker cmake是kitware公司以及一些开源开发者在开发几个工具套件(VTK)的过程中衍 生品,最终形成体系,成为一个独立的开放源代码项目 ...

  3. Sharepoint学习笔记—习题系列--70-576习题解析 -(Q92-Q94)

    Question  92  You are designing a SharePoint 2010 application. You need to make sure the application ...

  4. 【C语言】C语言简介

    目录: 1. [什么是C语言?] 2. [C语言历史] 3. [C语言标准] 4. [C语言特点] 1. 什么事C语言? · C语言是一门高级编程语言,用于人与计算机之间的沟通,就如同人与人之间沟通时 ...

  5. Android SQL语句实现数据库的增删改查

    本文介绍android中的数据库的增删改查 复习sql语法: * 增 insert into info (name,phone) values ('wuyudong','111') * 删 delet ...

  6. android 界面设计基本知识Ⅲ

    本章继续讲述在android界面设计中相关的知识点.介绍内容包括BroadcastReceiver(广播),Service(服务),Widget(小部件),WebView(网页加载控件). 1.Bro ...

  7. iOS之 FBMemoryProfiler FB的循环引用检测工具

    经过两天的google终于搞定了FBMemoryProfiler这个开源检测循环引用的工具.中间的曲折也是让人头疼,言归正传直接说一下这个memoryProfiler github:https://g ...

  8. 设计模式 之 策略(Strategy)模式

    最近看了<head first 设计模式>一书,便总结了里面的一些内容,今天就简单介绍一下策略模式. 策略模式:定义了算法族,分别封装起来,让他们能够相互替换,此模式让算法的变化独立于使用 ...

  9. 如何利用Pre.im分发iOS测试包

    大众创新万众创业,在移动互联网的风口,移动APP开发与测试发展方兴未艾,受到了越来越多的重视.相较 iOS,Android 的开发环境更加开放.Android 开发者要测试应用时,只需发个 APK 安 ...

  10. IO流04--毕向东JAVA基础教程视频学习笔记

    Day20 01 File概述02 File对象功能-创建和删除03 File对象功能-判断04 File对象功能-获取05 File对象功能-文件列表106 File对象功能-文件列表207 列出目 ...