各种MLE,这模板感觉有问题,next数组开128也会MLE,实际上可见字符为编号32~126,只用开100就行。

 #include <iostream>
#include <cstdio>
#include <string.h>
#include <algorithm>
#include <queue>
#pragma warning ( disable : 4996 )
using namespace std; inline int Max(int a,int b) { return a>b?a:b; }
inline int Min(int a,int b) { return a>b?b:a; }
const int inf = 0x3f3f3f3f;
const int maxn = 1e6+;
const int maxk = ; int N, M, tot;
int ans[];
char str[], test[]; struct node {
node* next[maxk];
node* fail;
int code;
bool end;
node() {
memset( next, NULL, sizeof(next) );
fail = NULL;
code = ; end = false;
}
}; void insert( node* root, int x )
{
node* p = root;
int len = strlen(str);
int tmp; for ( int i = ; i < len; i++ )
{
tmp = str[i]-;
if ( p->next[tmp] == NULL )
p->next[tmp] = new node();
p = p->next[tmp];
p->code = x;
}
p->end = true;
} void getnotfail( node* root )
{
queue<node*> q;
root->fail = NULL;
q.push(root);
while (!q.empty())
{
node *run= q.front(); q.pop();
node *tmp = NULL;
for ( int i = ; i < maxk; i++ )
{
if ( run->next[i] )
{ //如果节点是初始节点,则它的子节点的失败指针全部指向root
if(run==root) run->next[i]->fail = root;
else
{
tmp = run->fail; //tmp为它的父节点的上层节点
while (tmp)
{
if(tmp->next[i]) //寻找tmp的第i个子节点,如果存在,则run的fail指针指向它
{ run->next[i]->fail = tmp->next[i]; break; }
tmp = tmp->fail;
}
if(tmp==NULL)
run->next[i]->fail = root;
}
q.push(run->next[i]);
}
}
}
} int query( node* r )
{
int cnt = ;
int len = strlen(test);
node* p = r;
for ( int i = ; i < len; i++ )
{
int x = test[i]-;
while (!p->next[x]&&p!=r) p = p->fail; p = p->next[x];
if (!p) p = r;
node *tmp = p; while (tmp!=r&&tmp->end)
{
ans[cnt++] = tmp->code;
tmp = tmp->fail;
}
}
return cnt;
} int main()
{ while ( ~scanf("%d", &N ))
{
node* r = new node; for ( int i = ; i <= N; i++ )
{ scanf("%s", str); insert(r, i); }
getnotfail(r);
cin >> M; for ( int i = ; i <= M; i++ )
{
scanf( "%s", test );
int num = query(r);
if (num)
{
sort(ans, ans + num);
printf( "web %d:", i );
for ( int j = ; j < num; j++ )
printf(" %d", ans[j]);
cout << endl;
tot++;
memset( ans, , sizeof(ans) );
}
}
printf("total: %d\n", tot);
}
return ;
}

HDU2896 病毒侵袭 AC自动机模板的更多相关文章

  1. HDu-2896 病毒侵袭,AC自动机模板题!

    病毒侵袭 模板题,不多说了.. 题意:n个不同的字符串分别代表病毒特征,给出m次查询,每次一个字符串(网址),求这个字符串中有几个病毒特征,分别从大到小输出编号,最后输出所有的带病毒网址个数.格式请看 ...

  2. hdu2896 病毒侵袭 AC自动机入门题 N(N <= 500)个长度不大于200的模式串(保证所有的模式串都不相同), M(M <= 1000)个长度不大于10000的待匹配串,问待匹配串中有哪几个模式串,

    /** 题目:hdu2896 病毒侵袭 链接:http://acm.hdu.edu.cn/showproblem.php?pid=2896 题意:N(N <= 500)个长度不大于200的模式串 ...

  3. HDU2896 病毒侵袭 —— AC自动机

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

  4. hdu2896 病毒侵袭 ac自动机

    地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=2896 题目: 病毒侵袭 Time Limit: 2000/1000 MS (Java/Othe ...

  5. hdu2896病毒侵袭(ac自动机)

    链接 ac自动机的模板题 说2个注意的地方 一是题目说明包含所有ASCII字符,可以开到0-127 包含空格 题目会输入多个源串,在加完当前的val值时,不应清0,可以开个标记数组. #include ...

  6. hdu 2896 病毒侵袭 ac自动机

    /* hdu 2896 病毒侵袭 ac自动机 从题意得知,模式串中没有重复的串出现,所以结构体中可以将last[](后缀链接)数组去掉 last[]数组主要是记录具有相同后缀模式串的末尾节点编号 .本 ...

  7. hdu 2896 病毒侵袭 AC自动机(查找包含哪些子串)

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

  8. 【HDU2896】病毒侵袭 AC自动机

    [HDU2896]病毒侵袭 Problem Description 当太阳的光辉逐渐被月亮遮蔽,世界失去了光明,大地迎来最黑暗的时刻....在这样的时刻,人们却异常兴奋--我们能在有生之年看到500年 ...

  9. hdu 2896 病毒侵袭 AC自动机 基础题

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

随机推荐

  1. Django2.0+小程序技术打造微信小程序助手✍✍✍

    Django2.0+小程序技术打造微信小程序助手  整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问题 ...

  2. 【Oracle】如何在查询视图时使用索引

    通常我们使用hint来固定查询计划选择走表的索引 固定表的连接等等,但是如果第一层查询的是视图呢? yang@rac1>CREATE TABLE TA (ID NUMBER, NAME VARC ...

  3. iOS逆向系列-theos

    概述 theos是GitHub开源的一个项目,通过nic.pl创建tweak项目.通过编写我们注入代码,然后执行编译.打包.安装等操作将代码注入iPhone安装的制定程序. theos环境配置 安装签 ...

  4. linux 文件类型的颜色

    linux文件颜色的含义:蓝色代表目录 绿色代表可执行文件 红色表示压缩文件 浅蓝色表示链接文件 灰色表示其他文件 红色闪烁表示链接的文件有问题了 黄色表示设备文件 蓝色文件----------目录 ...

  5. Array.prototype.splice()

    splice() 方法通过删除或替换现有元素或者原地添加新的元素来修改数组,并以数组形式返回被修改的内容.此方法会改变原数组. 在1位置上添加一项 我们没有下标为4的项,这个超了,就在最大项后面添加这 ...

  6. hdu 5382

    \(F(n)=\sum_{i=1}^n\sum_{j=1}^n[lcm(i,j)+gcd(i,j)\geq n]\) \(S(n)=\sum_{i=1}^nF(i)\) \(F(n)=n^2-\sum ...

  7. SSM项目实现连接两个mysql数据库

    最近做项目需要用到另一个数据库的内容,多方查找终于实现了功能. 我们都知道,在SSM框架中,我们在applicationContext.xml配置文件中添加数据源就可以实现数据库增删改查,但是只能连接 ...

  8. centos6 nginx安装好以后,添加拓展ssl

    前言 安装nginx的时候,只是执行最简单的安装,--user=nobody --group=nobody --prefix=/usr/local/nginx_1.8.1,没有安装http_ssl_m ...

  9. 过滤器filters

    <!DOCTYPE html> <html lang="zh"> <head> <title></title> < ...

  10. vue 全局过滤器(单个和多个过滤器)

    参考: https://www.cnblogs.com/liujn0829/p/8622960.htmlhttps://blog.csdn.net/z8735058/article/details/7 ...