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 ...
随机推荐
- Java之实现多线程
保证同步的几种方法: (1) 同步方法,synchronized 关键字修饰方法.由于Java中的每个对象都有一个内置锁,当用该关键词修饰时,内置锁会保护整个方法.在调用该方法前,需要获得内置锁,否则 ...
- 创建你的 /proc 文件
一旦你有一个定义好的 read_proc 函数, 你应当连接它到 /proc 层次中的一个入口项. 使用一个 creat_proc_read_entry 调用: struct proc_dir_ent ...
- 锋利的Jquery(点击显示隐藏div)
点击显示隐藏div <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://w ...
- safari跨域cookie的问题
最近做了一个项目,是将自己公司的H5页面嵌入到其他公司的pc和移动端,采用的方案是iframe,跨域数据传输用的postMessage,最后在联调过程中发现iPhone的微信中无法打开,在 Setti ...
- WCF进阶:扩展bindingElementExtensions支持对称加密传输
前面两篇文章WCF进阶:将编码后的字节流压缩传输和WCF 进阶: 对称加密传输都是实现了自定义编码,那两个例子中托管服务或者客户端调用都采用的代码实现,WCF更友好的方式是在app.config或 ...
- C# StructLayout(LayoutKind.Sequential)]
结构体是由若干成员组成的.布局有两种1.Sequential,顺序布局,比如struct S1{ int a; int b;}那么默认情况下在内存里是先排a,再排b也就是如果能取到a的地址,和b的 ...
- Python学习day44-数据库(单表及多表查询)
figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...
- python3-常用模块之time
import time time模块主要是处理各种类型的时间 常用方法 1.time.sleep(secs) (线程)推迟指定的时间运行,单位为秒. 2.time.time() 获取当前时间戳 时间戳 ...
- python学习笔记4.2_正则表达式
常用正则表达式:http://tool.chinaz.com/regex/ 1.正则表达式:提供了一种在文本中灵活查找或匹配字符串模式的方法.单个表达式通常被称为regex. 2.python的re模 ...
- vue表格之@row-click="handleSelect" 与setCurrentRow
作用:表格行点击触发的事件 注意与@change.@selection-change事件的区分 <el-table ref="RoomTable" @row-click=&q ...