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. 160407、java实现多线程同步

    多线程就不说了,很好理解,同步就要说一下了.同步,指两个或两个以上随时间变化的量在变化过程中保持一定的相对关系.所以同步的关键是多个线程对象竞争同一个共享资源. 同步分为外同步和内同步.外同步就是在外 ...

  2. XML 配置里的 Bean 自动装配

    在XML文件中,先看一下下面的代码: <bean id="student" class="com.jeremy.spring.beans.student" ...

  3. SQL中的循环获取根节点

    方法一: DECLARE @employeeid INT; set @employeeid = 8115; DECLARE @id INT; DECLARE @pid int; DECLARE @le ...

  4. Oracle 删除表

    drop table books;的指令会将表放到回收站里, 用 flashback table "BIN$1Oiy3qm/QJubov1BwBUOgw==$0" to befor ...

  5. SpringBoot 配置文件 YML/Profile

    1. 全局配置文件 application.properties application.yml 配置文件名是固定的; 配置文件存放在src/main/resources目录或者类路径/config下 ...

  6. d3.js:数据可视化利器之 交互行为:响应DOM事件

    selection.on:事件监听操作符 on()操作符可以添加或移除选择集中每个 DOM元素的事件监听函数: selection.on(type[,listener[,capture]]) 参数ty ...

  7. 【react router路由】<Router> <Siwtch> <Route>标签

    博客 https://www.jianshu.com/p/ed5e56994f13?from=timeline 文档 http://react-guide.github.io/react-router ...

  8. git在使用中出现 refusing to merge unrelated histories如何解决?

    一.GIT的使用 # 设置用户名 git config --global user.name "zhaijihai" # 设置用户邮箱 git config --global us ...

  9. Jmeter(八)Jmeter监控tomcat

    1.配置tomcat的配置文件conf/tomcat-users.xml 2. 在“线程组”上右键“添加”--“配置元件”--“HTTP授权管理器”,这里主要是让JMeter能够通过Tomcat的基本 ...

  10. PHP 基础篇 - PHP 错误级别详解

    一.前言 最近经常看到工作 2 年左右的童鞋写的代码也会出现以静态方法的形式调用非静态方法,这是个 Deprecated 级别的语法错误,代码里不应该出现的.对方很郁闷,说:为什么我的环境可以正常运行 ...