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

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
题解:
  AC自动机,注意病毒特征码和网站源码不只有小写字母,还有输出的时候要注意格式,具体看代码。
 #include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
const int maxn=;
char buf[maxn];
int N,M,cnttot;
int ans[maxn],cntweb;
struct Tire{
int next[maxn][],end[maxn];
vector<int> kin[maxn];
int fail[maxn],root,tot;
int newnode(){
for(int i=;i<;i++) next[tot][i]=-;
end[tot++]=;
return tot-;
}
void init(){
tot=;
root=newnode();
}
void insert(char buf[],int k){//把第 k种类型的病毒信息放在字典树中
int len=strlen(buf);
int now=root;
for(int i=;i<len;i++){
if(next[now][buf[i]]==-) next[now][buf[i]]=newnode();
now=next[now][buf[i]];
}
end[now]++; kin[now].push_back(k);
}
void build(){
queue<int> Q;
fail[root]=root;
for(int i=;i<;i++){
if(next[root][i]==-) next[root][i]=root;
else{
fail[next[root][i]]=root;
Q.push(next[root][i]);
}
}
while(!Q.empty()){
int now=Q.front(); Q.pop();
for(int i=;i<;i++){
if(next[now][i]==-) next[now][i]=next[fail[now]][i];
else{
fail[next[now][i]]=next[fail[now]][i];
Q.push(next[now][i]);
}
}
}
}
bool used[maxn];
void query(char buf[],int num){
int len=strlen(buf),now=root;
memset(used,false,sizeof(used));
for(int i=;i<len;i++){
now=next[now][buf[i]];
int tmp=now;
while(tmp!=root){
if(end[tmp]!=){
for(int j=;j<kin[tmp].size();j++){
int y=kin[tmp][j];
if(used[y]==false){
ans[++cntweb]=y;
used[y]=true;
}
}
}
tmp=fail[tmp];
}
}
if(cntweb!=){
cnttot++;
sort(ans+,ans+cntweb+);
printf("web %d:",num);
for(int i=;i<=cntweb;i++) printf(" %d",ans[i]);
printf("\n");
memset(ans,,sizeof(ans)); cntweb=;
}
}
}ac;
int main(){
scanf("%d",&N);
ac.init();
for(int i=;i<=N;i++){
scanf("%s",buf);
ac.insert(buf,i);
}
ac.build();
scanf("%d",&M);
for(int i=;i<=M;i++){
scanf("%s",buf);
ac.query(buf,i);
}
printf("total: %d\n",cnttot);
return ;
}

hdu 2896:病毒侵袭的更多相关文章

  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自己主动机)

    pid=2896">http://acm.hdu.edu.cn/showproblem.php?pid=2896 病毒侵袭 Time Limit: 2000/1000 MS (Java ...

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

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

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

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

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

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

  7. HDU 2896 病毒侵袭

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

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

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

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

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

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

    HDU 2222 仅仅求出了和文本串匹配的模式串个数,本题要求求出匹配的模式串的编号. 不同的部分在代码中的注释部分. #include <cstdio> #include <cst ...

随机推荐

  1. Python--上传文件和下载文件

    #!/usr/bin/env python# -*- coding: utf-8 -*-# @Time : 2017/12/28 13:56# @Author : Aries# @Site : # @ ...

  2. 移动端click时间、touch事件、tap事件

    一.click 和 tap 比较 两者都会在点击时触发,但是在手机WEB端,click会有 200~300 ms,所以请用tap代替click作为点击事件. singleTap和doubleTap 分 ...

  3. Arcengine 二次开发得到点shapefile的坐标

    做二次开发的时候,想要得到Point shapfile的坐标和相应的属性,也就是Point 的(x,y)和某个属性,在网上查了一些资料,做总结如下 首先,你要确定自己要操作的图层,一般来说,得到当前操 ...

  4. wf-删除所选

    w框架-结合用户的不同点击路径,提交正确的id集合. <table class="table"> <tr> <td></td> &l ...

  5. Spring数据访问和事务

    1.模型 2.解耦 3.实现 3.1 核心接口 3.2 代码分析 3.2.1 事务管理 3.2.2 数据访问 4.使用 4.1 编程模式 4.2 配置模式 4.2.1 声明式配置方式 4.2.2 注解 ...

  6. Vi 的常用命令

    1. vi 的三种工作模式 命令模式 打开文件首先进入命令模式, 是使用 vi 的入口; 通过命令对文件进行常规的编辑操作, 例如: 定位,翻页,复制,粘贴,删除等; 末行模式 执行保存,退出等操作, ...

  7. 深入浅出MySQL-DDL语句

    DDL语句 DDL是数据定义语言的缩写,简单来说,就是对数据库内部的对象进行创建.删除.修改等操作的语言.它和DML(数据操纵语言)的最大区别是DML知识对表内部的数据操作,而不涉及表的定义.结构的修 ...

  8. spring MVC学习(三)

    1. @RequestMapping: 在请求的路径中传递参数:参数作为路径的一部分,可以在路径中直接使用 {paramName}来表示,另一种就是更加传统的表示方式?paramName=paramV ...

  9. 16.遇到就jar mismatch! Fix your dependencies的问题

    这是因为两个项目的jar包(android-support-v4.jar)不一致. 解决方法是把2个jar都删除,然后各自加上最新的jar包 但是换了之后发现R文件编不出来,原因是minsdk的设置问 ...

  10. PAT 1049 Counting Ones [难]

    1049 Counting Ones (30 分) The task is simple: given any positive integer N, you are supposed to coun ...