当太阳的光辉逐渐被月亮遮蔽,世界失去了光明,大地迎来最黑暗的时刻。。。。在这样的时刻,人们却异常兴奋——我们能在有生之年看到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

题解:

就跑一遍AC自动机代码就完了,比起原板子题Keywords Search HDU - 2222就改了一点

AC自动机代码详解看Keywords Search HDU - 2222

代码:

  1 /*
2 代码中:
3 叶节点:代表此节点下没有子节点
4 根节点:就是树的根
5 子节点:就是这个节点的直接相连的节点(直系节点)
6
7 此代码:
8 用题目所给模式串构成一颗字典树
9 然后找出来给出的待求串中每种模式串出现几次
10
11
12 1.题目中的字符是除去回车的ASCII码可见字符(95个),我最开始定义的是以全部的ASCII码的个数(128)为基准的
13 2.输出要排序后再输出
14 */
15 #include<stdio.h>
16 #include<iostream>
17 #include<string.h>
18 #include<algorithm>
19 #include<queue>
20 using namespace std;
21 const int maxn=30000000;
22 typedef long long ll;
23 int visit[maxn],length[1005];
24 int v[1005][1005],n,m;
25 struct Trie
26 {
27 int next[maxn/100][128],fail[maxn],ends[maxn];
28 int root,L;
29 int New_node() //创建一个新节点
30 {
31 for(int i=0; i<128; ++i)
32 {
33 next[L][i]=-1;
34 }
35 ends[L++]=0;
36 return L-1;
37 }
38 void init() //创建根节点
39 {
40 L=0;
41 root=New_node();
42 }
43 void inserts(char s[],int x) //往字典树里面插入新字符串
44 {
45 int len=strlen(s);
46 int now=root;
47 for(int i=0; i<len; ++i)
48 {
49 if(next[now][s[i]]==-1)
50 next[now][s[i]]=New_node();
51 now=next[now][s[i]];
52 }
53 ends[now]=x;
54 }
55 void build()
56 {
57 queue<int>r;
58 fail[root]=root;
59 for(int i=0; i<128; ++i)
60 {
61 if(next[root][i]==-1)
62 {
63 next[root][i]=root;
64 }
65 else
66 {
67 fail[next[root][i]]=root;
68 r.push(next[root][i]);
69 }
70 }
71 while(!r.empty())
72 {
73 int now=r.front();
74 r.pop();
75 for(int i=0; i<128; ++i)
76 {
77 if(next[now][i]==-1)
78 {
79 next[now][i]=next[fail[now]][i]; //叶节点处没有设置失败节点而是往next上接了一段,这个时候
80 //这个fail里面的值已经在下面的else里面放过东西了
81 }
82 else
83 {
84 fail[next[now][i]]=next[fail[now]][i]; //此节点的子节点的失败节点就是此节点失败节点对应字符位置
85 r.push(next[now][i]);
86 }
87 }
88 }
89 }
90 void query(char s[],int x)
91 {
92 int len=strlen(s);
93 int now=root;
94 for(int i=0; i<len; ++i)
95 {
96 now=next[now][s[i]]; //这个now就保证了我们找的肯定是这个字符串中的一部分
97 int temp=now; //这就是一直找,找到了就加1,找不到就通过失败节点看其他地方能不能找到
98 while(temp!=root)
99 {
100 if(ends[temp] && !visit[temp])
101 {
102 visit[temp]=1;
103 v[x][length[x]++]=ends[temp];
104 }
105 temp=fail[temp];
106 }
107 }
108 }
109 };
110 char s[maxn];
111 Trie ac;
112 void init()
113 {
114 for(int i=0; i<=ac.L; ++i)
115 {
116 visit[i]=0;
117 }
118 for(int i=1; i<=n; ++i)
119 length[i]=0;
120 }
121
122 int main()
123 {
124 scanf("%d",&n);
125 ac.init();
126 for(int i=1; i<=n; ++i)
127 {
128 scanf("%s",s);
129 ac.inserts(s,i);
130 }
131 scanf("%d",&m);
132 ac.build();
133 int ans=0;
134 for(int i=1; i<=m; ++i)
135 {
136 init();
137 scanf("%s",s);
138 ac.query(s,i);
139 if(length[i])
140 {
141 ans++;
142 printf("web %d: ",i);
143 sort(v[i],v[i]+length[i]); //之前是忘记加这个一直错,想的时候还知道要排序,写代码的时候就忘了
144 for(int j=0; j<length[i]; ++j)
145 {
146 if(j!=length[i]-1) printf("%d ",v[i][j]);
147 else printf("%d\n",v[i][j]);
148 }
149 }
150 }
151 printf("total: %d\n",ans);
152 return 0;
153 }

病毒侵袭 HDU - 2896 板子题的更多相关文章

  1. 病毒侵袭 HDU - 2896(ac自动机 板题)

    当太阳的光辉逐渐被月亮遮蔽,世界失去了光明,大地迎来最黑暗的时刻....在这样的时刻,人们却异常兴奋——我们能在有生之年看到500年一遇的世界奇观,那是多么幸福的事儿啊~~ 但网路上总有那么些网站,开 ...

  2. 病毒侵袭 - HDU 2896(AC自动机)

    分析:有点需要注意的,输入的字符是所有可见的ASCII码,刚开始没看清一直以为是小写字母.............注意到这点后这题就是裸的自动机了.   代码如下: ================= ...

  3. AC日记——病毒侵袭 hdu 2896

    2896 思路: 好题: 代码: #include <queue> #include <cstdio> #include <cstring> using names ...

  4. hdu 2896 病毒侵袭 AC自动机 基础题

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

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

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

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

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

  7. 敌兵布阵 HDU - 1166 板子题

    #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> ...

  8. HDU - 2222,HDU - 2896,HDU - 3065,ZOJ - 3430 AC自动机求文本串和模式串信息(模板题)

    最近正在学AC自动机,按照惯例需要刷一套kuangbin的AC自动机专题巩固 在网上看过很多模板,感觉kuangbin大神的模板最为简洁,于是就选择了用kuangbin大神的模板. AC自动机其实就是 ...

  9. 病毒侵袭持续中 HDU - 3065 AC自动机

    小t非常感谢大家帮忙解决了他的上一个问题.然而病毒侵袭持续中.在小t的不懈努力下,他发现了网路中的"万恶之源".这是一个庞大的病毒网站,他有着好多好多的病毒,但是这个网站包含的病毒 ...

随机推荐

  1. 九:APP及其他资产

    APP提取一键反编译提取 APP抓数据包进行工具配合 各种第三方应用相关探针技术 各种服务器接口相关探针技术 APP提取及抓包及后续配合 某APK一键提取反编译 利用burp历史抓更多URL 某IP无 ...

  2. Linux 服务器安装node环境

    Linux 装 node 环境 我的是 CentOS 查看服务器是多少位系统 getconf LONG_BIT 下载地址, 下载对应的版本: http://nodejs.cn/download/ 我这 ...

  3. 纯原生javascript下拉框表单美化实例教程

    html的表单有很强大的功能,在web早期的时候,表单是页面向服务器发起通信的主要渠道.但有些表单元素的样式没办法通过添加css样式来达到满意的效果,而且不同的浏览器之间设置的样式还存在兼容问题,比如 ...

  4. Table controls and tabstrip controls

    本文转载自http://www.cnblogs.com/clsoho/archive/2010/01/21/1653268.html ONTROLS Syntax Forms Declaration ...

  5. MYSQL基础知识的复习3

    聚合函数 max():求最大值 例:求最高工资 select max(sal) from emp; min():求最小值 例:求最小工资 select min(sal) from emp; avg() ...

  6. std::thread线程库详解(3)

    目录 目录 前言 lock_guard scoped_lock (C++17) unique_lock shared_lock 总结 ref 前言 前两篇的博文分别介绍了标准库里面的线程和锁,这一次的 ...

  7. 一种优化递归算法的方法(javascript)

    看书的时候看到了这个比较酷的方法,分享一下. 一.问题描述:代码如下,我们以计算阶乘(factorial)为例,当重复调用factorial(9),factorial(8),factorial(7)的 ...

  8. 借助 AppleScript 一键打开工作空间

    我有个小毛病:同时只能在一个工程里工作. 假如让我开四五个 Webstorm,在工程里 A 改个Bug,然后又到工程 B 里加个需求,再去工程 C 发个版,切来切去一会儿就懵了. 于是有了这个项目:m ...

  9. forEach、for in、for of三者区别

    forEach更多的用来遍历数组for in 一般常用来遍历对象或jsonfor of数组对象都可以遍历,遍历对象需要通过和Object.keys()for in循环出的是key,for of循环出的 ...

  10. 理解前端模块概念:CommonJs与ES6Module

    前言 现代前端开发每时每刻都和模块打交道.例如,在项目中引入一个插件,或者实现一个供全局使用组件的JS文件.这些都可以称为模块. 在设计程序结构时,不可能把所有代码都放在一起.更为友好的组织方式时按照 ...