DESCRIPTION :大意是说。给你n个代表病毒的字符串。m个表示网站的字符串。让你计算有多少个网站被病毒感染了。被那些病毒感染了。

刚开始就想暴力。然而,忽略了条件:每个网站最多有三个病毒。于是。TLE了。于是换AC 自动机。于是MLE了。于是把最大的结构体指针数组换成队列。用时间来换空间。23333

应该注意结构体的初始化是必须的。

附代码:
AC 自动机:

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<queue>
#include<algorithm>
#include<map>
using namespace std;
#define T_SIZE 10000 struct trie{
trie* nexts[128];
trie* fail;
int num1, num2;
int mem;
trie(){
for(int i=0;i<128;i++){
nexts[i]=NULL;
}
fail=NULL;
num1= num2 = 0;
}
}; char T[T_SIZE+2];
queue<struct trie*>que;
int ans[50];
map<int, int>mm; void insert(trie* root,char* s, int m){
trie* p=root;
for(int i=0;s[i]!='\0';i++){
if(p->nexts[s[i]-0]==NULL)
p->nexts[s[i]-0]=new trie;
p=p->nexts[s[i]-0];
}
p->num1++;
p->mem = m;
} void build_ac_automation(trie* root){
que.push(root);
while(!que.empty()){
trie* fronts=que.front();
que.pop();
for(int i=0;i<128;i++){
if(fronts->nexts[i]!=NULL){
trie* p=fronts->fail;
while(p!=NULL){
if(p->nexts[i]!=NULL){
fronts->nexts[i]->fail=p->nexts[i];
break;
}
p=p->fail;
}
if(p==NULL){
fronts->nexts[i]->fail=root;
}
que.push(fronts->nexts[i]);
}
}
}
} int ac_find(trie* root,char* T){
trie* p=root;
int sum=0;
memset(ans,0,sizeof(ans));
for(int i=0,len=strlen(T);i<len;i++){
while(p->nexts[T[i]-0]==NULL && p!=root)
p=p->fail;
if(p->nexts[T[i]-0]!=NULL){
p=p->nexts[T[i]-0];
}
trie* temp=p;
temp->num2 = temp->num1;
while(temp!=root && temp->num2!=-1){
temp->num2 = temp->num1;
if (!mm[temp->mem])
{ans[sum]=temp->mem+1;
sum+=temp->num2;}
temp->num2=-1;
temp=temp->fail;
}
}
return sum;
} int main(){
int n;
while(scanf("%d",&n)!= EOF){
mm.clear();
int summ=0;
trie* root=new trie;
getchar();
for(int i=0;i<n;i++){
memset(T,0,sizeof(T));
gets(T);
insert(root,T, i);
}
build_ac_automation(root); int t;
scanf("%d",&t);
getchar();
for(int i=0;i<t;i++){
memset(T,0,sizeof(T));
gets(T);
int num=ac_find(root,T);
if(num!=0){
summ++;
printf("web %d:",i+1);
sort(ans, ans+num);
printf(" %d", ans[0]);
for(int j=1;j<num;j++){
if (ans[j] == ans[j-1])
continue;
printf(" %d",ans[j]);
}
printf("\n");
}
}
printf("total: %d\n",summ);
}
return 0;
}

POJ 2896 AC自动机 or 暴力的更多相关文章

  1. hdu 2896 AC自动机

    // hdu 2896 AC自动机 // // 题目大意: // // 给你n个短串,然后给你q串长字符串,要求每个长字符串中 // 是否出现短串,出现的短串各是什么 // // 解题思路: // / ...

  2. HDU 2896 (AC自动机模板题)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2896 题目大意:多个模式串.多个匹配串.其中串的字符范围是(0~127).问匹配串中含有哪几个模式串 ...

  3. POJ 3691 (AC自动机+状态压缩DP)

    题目链接:  http://poj.org/problem?id=3691 题目大意:给定N个致病DNA片段以及一个最终DNA片段.问最终DNA片段最少修改多少个字符,使得不包含任一致病DNA. 解题 ...

  4. BZOJ 2754: [SCOI2012]喵星球上的点名 [AC自动机+map+暴力]

    2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1902  Solved: 837[Submit][St ...

  5. POJ 2778 (AC自动机+矩阵乘法)

    POJ 2778 DNA Sequence Problem : 给m个只含有(A,G,C,T)的模式串(m <= 10, len <=10), 询问所有长度为n的只含有(A,G,C,T)的 ...

  6. hdu 2896 AC自动机模版题

    题意:输出出现模式串的id,还是用end记录id就可以了. 本题有个关键点:“以上字符串中字符都是ASCII码可见字符(不包括回车).”  -----也就说AC自动机的Trie树需要128个单词分支. ...

  7. Censored! POJ - 1625 AC自动机+大数DP

    题意: 给出一n种字符的字典,有p个禁用的单词, 问能组成多少个不同的长度为m的合法字符串.(m<=50) 题解: 是不是个我们之前做的题目非常非常像,题意都一样. 直接将上次写的AC自动机+矩 ...

  8. Censored! - POJ 1625(ac自动机+简单dp+高精度运算)

    题目大意:首先给一个字符集合,这个集合有N个字符,然后需要一个长度为M的句子,但是据子里面不能包含的串有P个,每个串里面的字符都是有字符集和里面的字符构成的,现在想知道最多能构造多少个不重复的句子. ...

  9. HDU 2896 AC自动机 裸题

    中文题题意不再赘述 注意字符范围是可见字符,从32开始到95 char c - 32 #include <stdio.h> #include <string.h> #inclu ...

随机推荐

  1. 20145205 武钰 《网络对抗》Exp8 Web基础

    一点题外话 本次实验我三号完成的,由于一些原因吧,一直没发博客,拖到了现在,这里说就是评判一下自己的懒惰. 实验后问题回答 (1)什么是表单 表单在网页中主要负责数据采集功能. 一个表单有三个基本组成 ...

  2. 在Windows下搭建Android开发环境及遇到的问题

    转载1:http://www.cnblogs.com/xdp-gacl/p/4322165.html 转载2:http://www.cnblogs.com/zoupeiyang/p/4034517.h ...

  3. topcoder srm 620 div1

    problem1 link 分别计算可以得到(a,b)的有哪些二元组,以及可以得到(c,d)的有哪些二元组.然后在公共的二元组中找到和最大的即可. problem2 link 设最后的排序为$r=[2 ...

  4. python_实现发送邮件功能

    #!/usr/bin/env python #-*- coding:utf-8 -*- from email import encoders from email.header import Head ...

  5. python装饰器,其实就是对闭包的使用。

    装饰器 理解装饰器要先理解闭包(在闭包中引用函数,可参考上一篇通过例子来理解闭包). 在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator). 装饰器的实质就是对闭包的使用,原函数被 ...

  6. Django组件(二) Django之Form

    Forms组件概述 forms组件 -Django提供的用语数据校验和模板渲染的组件 -在项目中创建一个py文件 -1 写一个类继承Form -2 在类中写属性,写的属性,就是要校验的字段 -3 使用 ...

  7. Makefile使用总结【转】

    1. Makefile 简介 Makefile 是和 make 命令一起配合使用的. 很多大型项目的编译都是通过 Makefile 来组织的, 如果没有 Makefile, 那很多项目中各种库和代码之 ...

  8. openwrt如何单独编译uboot

    答:make package/boot/uboot-<chip series>/compile

  9. 【java工具类】java做的一个xml转Excel工具,基于maven工程

    说明:适合数据库导出为xml时转成Excel 本工具将上传至GitHub:https://github.com/xiaostudy/xiaostudyAPI3 doc4j的maven依赖 <!- ...

  10. 【TCP/IP详解 卷一:协议】TCP定时器 小结

    前言 在有关TCP的章节中,介绍了四种定时器,它们体现了TCP的可靠性,其中最重要的 就是重传定时器了,剩下的定时器都是为了解决TCP的理解上的一些问题而设置的. 四种定时器: 2MSL定时器,出现在 ...