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. CSS高级布局

    float属性 基本浮动规则 先来了解一下block元素和inline元素在文档流中的排列方式. block元素通常被现实为独立的一块,独占一行,多个block元素会各自新起一行,默认block元素宽 ...

  2. attr返回被选元素的属性值

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. spring实现定时任务的两种方式

    本文为博主原创,未经允许不得转载 项目中要经常事项定时功能,在网上学习了下用spring的定时功能,基本有两种方式,在这里进行简单的总结, 以供后续参考,此篇只做简单的应用. 1.在spring-se ...

  4. 肿瘤基因组学数据库终结者:cBioPortal---转载

    转载自:http://blog.sciencenet.cn/blog-1509670-1000479.html 随着芯片和高通量测序技术的广泛应用,在肿瘤研究领域积累了越来越多的基因组学数据,特别是像 ...

  5. python 时间元组转时间戳

    #!/usr/bin/python # -*- coding: UTF- -*- import time print(time.mktime((, , , , , , , , ))) 输出 15382 ...

  6. xss脚本注入后端的防护

    1.脚本注入最主要的是不要相信用户输入的任何数据,对数据进行转义 可以使用:org.springframework.web.util.HtmlUtils包中的 HtmlUtils.htmlEscape ...

  7. Codeforces 101628A - Arthur's Language

    101628A - Arthur's Language 思路:dp,状态转移见代码. 代码: #include<bits/stdc++.h> using namespace std; #d ...

  8. jsp / get 中文乱码问题

    POST 方式下的解决方式还算简单,因为POST 方式下提交的数据都是以二进制的方式附加在http请求的body部分发送,只需要在后台指定编码格式就足矣解决. GET 方式下会将参数直接附加到url ...

  9. 一个或多个音频服务未运行 win7 错误1079:此服务的账户不同于运行于同一进程上的其他服务账户

    一个或多个音频服务未运行 win7 错误1079:此服务的账户不同于运行于同一进程上的其他服务账户 启动任务管理器:右键计算机——管理——”服务和应用程序“选项——”服务“——找到“windows a ...

  10. 【转】ArcGIS API for Silverlight/WPF 2.1学习笔记(五)

    2.Find示例代码 (1)xaml文件: //添加Symbol命名空间 xmlns:esriSymbols="clr-namespace:ESRI.ArcGIS.Client.Symbol ...