HDU2896 病毒侵袭 AC自动机模板
各种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自动机模板的更多相关文章
- HDu-2896 病毒侵袭,AC自动机模板题!
病毒侵袭 模板题,不多说了.. 题意:n个不同的字符串分别代表病毒特征,给出m次查询,每次一个字符串(网址),求这个字符串中有几个病毒特征,分别从大到小输出编号,最后输出所有的带病毒网址个数.格式请看 ...
- hdu2896 病毒侵袭 AC自动机入门题 N(N <= 500)个长度不大于200的模式串(保证所有的模式串都不相同), M(M <= 1000)个长度不大于10000的待匹配串,问待匹配串中有哪几个模式串,
/** 题目:hdu2896 病毒侵袭 链接:http://acm.hdu.edu.cn/showproblem.php?pid=2896 题意:N(N <= 500)个长度不大于200的模式串 ...
- HDU2896 病毒侵袭 —— AC自动机
题目链接:https://vjudge.net/problem/HDU-2896 病毒侵袭 Time Limit: 2000/1000 MS (Java/Others) Memory Limit ...
- hdu2896 病毒侵袭 ac自动机
地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=2896 题目: 病毒侵袭 Time Limit: 2000/1000 MS (Java/Othe ...
- hdu2896病毒侵袭(ac自动机)
链接 ac自动机的模板题 说2个注意的地方 一是题目说明包含所有ASCII字符,可以开到0-127 包含空格 题目会输入多个源串,在加完当前的val值时,不应清0,可以开个标记数组. #include ...
- hdu 2896 病毒侵袭 ac自动机
/* hdu 2896 病毒侵袭 ac自动机 从题意得知,模式串中没有重复的串出现,所以结构体中可以将last[](后缀链接)数组去掉 last[]数组主要是记录具有相同后缀模式串的末尾节点编号 .本 ...
- hdu 2896 病毒侵袭 AC自动机(查找包含哪些子串)
病毒侵袭 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- 【HDU2896】病毒侵袭 AC自动机
[HDU2896]病毒侵袭 Problem Description 当太阳的光辉逐渐被月亮遮蔽,世界失去了光明,大地迎来最黑暗的时刻....在这样的时刻,人们却异常兴奋--我们能在有生之年看到500年 ...
- hdu 2896 病毒侵袭 AC自动机 基础题
病毒侵袭 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
随机推荐
- Linux QtCreator 创建工程
这一天天的,都快成废物了, 每天忙得要死, 各种乱七八糟杂事,连点学习的时间都没有了, 这才一年不碰Linux,创建工程都不会了, Ubuntu 1N.N.N + QtCreator 创建工程 不安装 ...
- Java开发系列-JDBC
概述 JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和 ...
- CentOS7配置Docker镜像加速器
1. 将默认的配置文件复制出来 cp -n /lib/systemd/system/docker.service /etc/systemd/system/docker.service 2. 将加速器地 ...
- vue element传的值报_self.$scopedSlots.default is not a function
问题描述:使用表格时做了v-if判断:首次渲染没有问题:反复操作便会报错: 解决办法:el-table上给v-if的 el-table-colunm 加上:key="Math.random( ...
- 2-sat——暴力染色输出方案hdu1814
因为要求输出字典序最小的解,所以用暴力染色 具体有点像二分图染色 遍历0-2*n-1个点,尝试将每个点染成1,该点所能到达的所有点都要染成1 如果不行,则把上该点的影响消除,再把对立点染成1,如果还不 ...
- Python更新后ros用不了的bug
一.原因 我同时安装了python2.7 和3.5,而且将python默认配置为python3.5,所以ros并不支持,所以提示找不到. 2.解决方式 通过修改不同版本的python的优先级,将pyt ...
- springboot与任务(异步任务)
描述:在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的:但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在Spring 3.x ...
- 深入浅出Mybatis系列(一)---Mybatis入门[转]
最近两年 springmvc + mybatis 的在这种搭配还是蛮火的,楼主我呢,也从来没真正去接触过mybatis, 趁近日得闲, 就去学习一下mybatis吧. 本次拟根据自己的学习进度,做一次 ...
- 笔试之const问题
1 . ; int *j=(int *)&i; *j=; cout<<i<<*j<<endl; 答案i为0,*j为1. 2. char * const p= ...
- Django的日常-视图层
目录 Django的日常-3 JsonResponse form表单上传文件 CBV的源码分析 视图层 模板传值 过滤器 标签 自定义过滤器和标签 Django的日常-3 JsonResponse 在 ...