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. 160427、CSS3实战笔记--多列布局

    通过阅读和学习书籍<CSS3实战>总结 <CSS3实战>/成林著.—北京机械工业出版社2011.5   多列布局适合纯文字版式设计,如报纸内和杂志类网页布局,不适合做网页结构布 ...

  2. node sever

    一.基础创建服务器 // 引入Http var http = require("http"); // 创建服务器 http.createServer(function(reques ...

  3. selector.select(500); EventLoop及事件循环机制 netty 在半透明做代理网关下 对请求的批处理

    Netty框架学习之路(五)—— EventLoop及事件循环机制 - 懋懋之为 - CSDN博客 https://blog.csdn.net/tjreal/article/details/79751 ...

  4. SoftReference、WeakReference、PhantomRefrence分析和比较

    级别 什么时候被垃圾回收 用途 生存时间 强引用 从来不会 对象的一般状态 JVM停止运行时终止 软引用 在内存不足时 优化内存使用 内存不足时终止 弱引用 在垃圾回收时 对象缓存 gc运行后终止 虚 ...

  5. HTML容易遗忘内容(一)

    HTML基础语法: <html> <head> <tiltle>Hello</tiltle> </head> <body bgcolo ...

  6. 常用的自定义Python函数

    常用的自定义Python函数 1.时间戳转为日期字串,精确到ms.单位s def timestamp2datems(timestamp): ''' 时间戳转为日期字串,精确到ms.单位s :param ...

  7. 3D游戏引擎中常见的三维场景管理方法

    对于一个有很多物体的3D场景来说,渲染这个场景最简单的方式就是用一个List将这些物体进行存储,并送入GPU进行渲染.当然,这种做法在效率上来说是相当低下的,因为真正需要渲染的物体应该是视椎体内的物体 ...

  8. TensorFlow学习笔记(三)-- feed_dict 使用

    个人理解:就是TF的一种输入语法. 跟C语言的scanf(),C++的 cin>> 意思差不多,只是长相奇怪了点而已. 做完下面几个例子,基本也就适应了. 首先占位符申请空间:使用的时候, ...

  9. MongoDB主从复制+集群

    一.读写分离的概念 读写分离,基本的原理是让主数据库处理事务性增.改.删操作(INSERT.UPDATE.DELETE),而从数据库处理SELECT查询操作.数据库复制被用来把事务性操作导致的变更同步 ...

  10. HTML5游戏开发系列教程5(译)

    原文地址:http://www.script-tutorials.com/html5-game-development-lesson-5/ 最终我决定准备下一篇游戏开发系列的文章,我们将继续使用can ...