一開始一直WA,之后发现这道题不止一组输入,改成多组输入之后就过了。

利用map把每一个字符串映射到它相应的结点上即可了。

11909467 2014-10-19 11:54:00 Accepted 3065 234MS 16912K 2754 B G++ KinderRiven
#include<queue>
#include<map>
#include<cstdio>
#include<string>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 55555;
const int max_size = 130;
char ss[1111][55];
map<string,int>vis;
struct Trie{
int next[maxn][max_size];
int fail[maxn];
int val[maxn];
int sz;
int root;
int num[maxn];
int index(char e){
return e - 31;
}
void init(){
sz = 0;
root = newnode();
}
int newnode(){
val[sz] = 0; num[sz] = 0;
memset(next[sz],-1,sizeof(next[sz]));
sz ++;
return sz - 1;
}
void insert(char *str){
int L = strlen(str);
int u = root;
for(int i = 0; i < L; i++){
int e = index(str[i]);
if(next[u][e] == -1)
next[u][e] = newnode();
u = next[u][e];
}
val[u] = 1; //有单词
vis[string(str)] = u;
}
void build(){ //建立失配边
fail[root] = root;
queue<int>q;
for(int i = 0; i < max_size; i++){
if(next[root][i] == -1)
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 = 0; i < max_size; i++){
if(next[now][i] == -1)
next[now][i] = next[fail[now]][i];
else{ //这个点是一个单词的结尾
fail[next[now][i]] = next[fail[now]][i];
q.push(next[now][i]);
}
}
}
}
void count(char *str){
int now = root;
int L = strlen(str);
for(int i = 0; i < L; i++){
int e = index(str[i]);
now = next[now][e];
int temp = now;
while(temp != root){
if(val[temp]){ //假设这个结点是个单词末尾
num[temp] ++;
//printf("%d\n",temp);
}
temp = fail[temp];
}
}
}
};
Trie ac;
char _str[2222222];
int main(){
int n;
while(scanf("%d",&n) != EOF){
ac.init();
vis.clear();
getchar();
for(int i = 0; i < n ; i ++){
gets(ss[i]);
ac.insert(ss[i]);
}
ac.build();
gets(_str);
ac.count(_str);
for(int i = 0; i < n; i++){
int t = vis[string(ss[i])];
if(ac.num[t]){
printf("%s: %d\n",ss[i],ac.num[t]);
}
}
}
return 0;
}

【HDU】病毒侵袭持续中(AC自己主动机+map)的更多相关文章

  1. hdu 3056 病毒侵袭持续中 AC自己主动机

    http://acm.hdu.edu.cn/showproblem.php?pid=3065 刘汝佳的模板真的非常好用,这道题直接过 学到: cnt数组记录单词出现次数 以及map存储单词编号与字符串 ...

  2. HDU 3065 病毒侵袭持续中 (AC自动机)

    题目链接 Problem Description 小t非常感谢大家帮忙解决了他的上一个问题.然而病毒侵袭持续中.在小t的不懈努力下,他发现了网路中的"万恶之源".这是一个庞大的病毒 ...

  3. hdu3065 病毒侵袭持续中 AC自动机入门题 N(N <= 1000)个长度不大于50的模式串(保证所有的模式串都不相同), 一个长度不大于2000000的待匹配串,求模式串在待匹配串中的出现次数。

    /** 题目:hdu3065 病毒侵袭持续中 链接:http://acm.hdu.edu.cn/showproblem.php?pid=3065 题意:N(N <= 1000)个长度不大于50的 ...

  4. hdu----(3065)病毒侵袭持续中(AC自动机)

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

  5. HDU3065 病毒侵袭持续中 —— AC自动机

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

  6. HDU-3065 病毒侵袭持续中 AC自动机又是一板子!

    病毒侵袭持续中 上一题是求出现多少病毒输出病毒序号,而这题输出每个病毒出现的次数.这题有字典树基础都能做出来,把叶子节点用相应的编号标记起来,匹配的时候遍历到叶子节点用一个数组把次数存起来就行了. 有 ...

  7. [hdu3065]病毒侵袭持续中(AC自动机)

    题意:给出多种病毒的号码和特征码,计算在某串中各病毒匹配的次数. 解题关键:AC自动机模板题,多组输入坑人. #include<bits/stdc++.h> using namespace ...

  8. hdoj 3065 病毒侵袭持续中(AC自动机)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3065 思路分析:问题需要模式匹配多个模式串,需要注意的是模式串会包含和重叠,需要对AC自动机的匹配过 ...

  9. HDU 3065 病毒侵袭持续中(AC自己主动机)

    题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=3065 Problem Description 小t非常感谢大家帮忙攻克了他的上一个问题.然而病毒侵袭 ...

  10. hdu 3065 病毒侵袭持续中【AC自动机】

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

随机推荐

  1. 高精度 java的一些题

    poj 1001 Exponentiation import java.util.*; import java.math.*; public class Main { public static vo ...

  2. 初识Sencha Touch:面板Panel

    HTML代码: <!doctype html> <html> <head> <meta charset="utf-8"> <t ...

  3. centeros resin安装脚本启动

    公司用的服务器是resin+apache #! /bin/sh # # See contrib/init.resin for /etc/rc.d/init.d startup script # # r ...

  4. 帝国cms内容页模版

    <title>[!--pagetitle--]</title> <meta name="keywords" content="[!--pag ...

  5. [问题解决] ubuntu server12.04 认证的问题

    错误: 今天无缘无故登录不了系统ubuntu server12.04. 在登录界面输入正确密码后,黑屏一闪后又跳转到登录界面. 黑屏出现的时间太短,经过多次查看发现,卡在check battery s ...

  6. dom元素和方法总结

    主要是参考<精通javascript>. 全局变量有: document.这个变量包含浏览器的html dom文档的引用. HTMElement 这个变量是所要html dom 元素的超类 ...

  7. 柯南君:看大数据时代下的IT架构(2)消息队列之RabbitMQ-基础概念详细介绍

    一.基础概念详细介绍 1.引言 你是否遇到过两个(多个)系统间需要通过定时任务来同步某些数据?你是否在为异构系统的不同进程间相互调用.通讯的问题而苦恼.挣扎?如果是,那么恭喜你,消息服务让你可以很轻松 ...

  8. poj2136---输出特殊图形

    #include <stdio.h> #include <stdlib.h> #include<string.h> ]; int find(int pos,int ...

  9. Linux-storage-stack-diagram

    just a diagram 一目了然. 对于isci 只是用过LIO和STGT 两种后端. 这里有各种后端的比较. http://scst.sourceforge.net/comparison.ht ...

  10. js的replace的用法;

    obj.replace("需要替换的字符串","替换后的字符串")