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. 逆向与BOF基础——注入shellcode并执行&Return-to-libc

    逆向与BOF基础--注入shellcode并执行 准备阶段 下载安装execstack. 本次实验实验的shellcode是心远的文章中生成的代码,即\x31\xc0\x50\x68\x2f\x2f\ ...

  2. C++ 细小知识点

    1. C++ 拷贝构造函数参数为const类型 原因:因为复制构造函数是用引用方式传递复制对象,引用方式传递的是地址,因此在构造函数内对该引用的修改会影响源对象,防止源对象被修改,就要把参数类型设为c ...

  3. 《Python程序设计(第3版)》[美] 约翰·策勒(John Zelle) 第 1 章 答案

    判断对错1.计算机科学是计算机的研究.2.CPU 是计算机的“大脑”.3.辅助存储器也称为 RAM.4.计算机当前正在处理的所有信息都存储在主存储器中.5.语言的语法是它的意思,语义是它的形式.6.函 ...

  4. 使用PopupWindow弹窗提醒

    一.新建view.xml 注意里面的控件要一个一个的定义离上一个控件的距离,即margin_top,不然最后的效果是紧缩的 二.在java中定义两个变量 1.View view=null: 2.pop ...

  5. TeeChart入门

    此链接可以作为参考http://tech.sina.com.cn/s/2008-07-07/1612722495.shtml 需要添加引用 using Steema.TeeChart;//tchart ...

  6. dp问题 -挑战例题 2017-7-24

    01 背包 题意: 在N件物品取出若干件放在容量为W的背包里,每件物品的体积为W1,W2……Wn(Wi为整数),与之相对应的价值为P1,P2……Pn(Pi为整数).求背包能够容纳的最大价值. f[i] ...

  7. [luogu 1070]道路游戏(NOIP2009T4)

    题目链接 题解: 题目描述好长啊.... 大概就是设一下$f[i]$表示第i秒的最大价值 首先枚举时间,然后因为机器人这一秒无论在哪里都是有可能的,所以要枚举一下每个点,又因为最多走p秒所以再枚举一下 ...

  8. vue.js组件(component)

    简介: 组件(Component)是 Vue.js 最强大的功能之一. 组件可以扩展 HTML 元素,封装可重用的代码. 组件系统让我们可以用独立可复用的小组件来构建大型应用,几乎任意类型的应用的界面 ...

  9. [NLP/Attention]关于attention机制在nlp中的应用总结

    原文链接: https://blog.csdn.net/qq_41058526/article/details/80578932 attention 总结 参考:注意力机制(Attention Mec ...

  10. 联想笔记本thinkpad按F2不能直接重命名

    联想笔记本thinkpad按F2不能直接重命名,而是Fn+F2. 解决: 按一下Fn+Esc(一般在左上角)