COGS 1913. AC自动机
★★ 输入文件:ACautomata.in 输出文件:ACautomata.out 简单对比
时间限制:1 s 内存限制:128 MB
【题目描述】
对,这就是裸的AC自动机。
要求:在规定时间内统计出模版字符串在文本中出现的次数。
【输入格式】
第一行:模版字符串的个数N(N<=10)。
第2->N+1行:N个字符串。(每个模版字符串的长度<=50)
第N+2行:一行很长的字符串。长度小于1e8。(使用AC自动机能在1s内计算出)
数据已加强
原前rk10复杂度不对的做法全部被卡tle(逃
by rapiz 2017/3/11
【输出格式】
共N行,每行输出一个模版及出现的次数。(之间有一个空格,按照输入顺序输出)
【样例输入】
4
hers
her
his
she
shershisher
【样例输出】
hers 1
her 2
his 1
she 2
【提示】
所有字母均为小写
所给模版不会重复
【来源】
AC自动机模板
1:不明觉厉的什么统计方法。。AC自动机
2:自己写的方法 List算法+AC自动机
Q:什么是list算法?
A:list算法 O(1)判断 O(1)时间内解决问题。
Q:能说的通俗点吗?
A:打表。
#include <cstring>
#include <string>
#include <cstdio>
struct node
{
int pos,id;
node * next[],*fail;
node()
{
for(int i=;i<;i++) next[i]=NULL;
fail=NULL;
id=pos=;
}
}*root;
int Q[],n,size,ans[];
void ins(int num,char *a)
{
node *p=root;
for(char *q=a;*q;q++)
{
int id=*q-'a';
if(p->next[id]==NULL)
{
p->next[id]=new node;
p->next[id]->id=++size;
}
p=p->next[id];
}
Q[num]=p->id;
p->pos=num;
}
node * q[];
int head=,tail=-;
char word[][];
void build()
{
for(int i=;i<;i++)
{
if(root->next[i])
{
root->next[i]->fail=root;
q[++tail]=root->next[i];
}
else root->next[i]=root;
}
while(head<=tail)
{
node * now=q[head++];
for(int i=;i<;i++)
{
if(now->next[i]!=NULL)
{
now->next[i]->fail=now->fail->next[i];
q[++tail]=now->next[i];
}
else now->next[i]=now->fail->next[i];
}
}
}
void query(char *a)
{
node * p=root;
int len=strlen(a);
for(int i=;i<len;i++ )
{
int id=a[i]-'a';
p=p->next[id];
ans[p->id]++;
}
for(int i=tail;i>=;i--)
{
p=q[i];
ans[p->fail->id]+=ans[p->id];
}
for(int i=;i<=n;i++) printf("%s %d\n",word[i],ans[Q[i]]);
}
char key[];
int Main()
{
freopen("ACautomata.in","r",stdin);
freopen("ACautomata.out","w",stdout);
root=new node;
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%s",word[i]);
ins(i,word[i]);
}
build();
scanf("%s",key);
query(key);
return ;
}
int sb=Main();
int main(int argc,char *argv[]){;}
AC自动机(指针)
#include <cstring>
#include <cstdio>
#include <queue> const int N = 1e8+;
using namespace std;
int size=,trie[][],fail[],num[],ans[];
inline int f(char ch)
{
if(ch<='Z') return ch-'A';
else return ch-'a'+;
}
inline void ins(int Num,char *a)
{
int p=;
for(char *q=a;*q;q++)
{
int id=f(*q);
if(!trie[p][id])
trie[p][id]=++size;
p=trie[p][id];
}
num[p]=Num;
}
void build()
{
for(int i=;i<=;i++) trie[][i]=;
queue<int>q;
q.push();
for(;!q.empty();)
{
int now=q.front();
q.pop();
for(int i=;i<=;i++)
{
if(trie[now][i])
{
if(now==) fail[trie[now][i]]=;
else
{
int tmp=fail[now];
for(;tmp;tmp=fail[tmp])
{
if(trie[tmp][i])
{
fail[trie[now][i]]=trie[tmp][i];
break;
}
}
if(!tmp) fail[trie[now][i]]=;
}
q.push(trie[now][i]);
}
}
}
}
char key[N];
void query()
{
scanf("%s",key);
int len=strlen(key);
int p=;
for(int i=;i<len;i++)
{
int id=f(key[i]);
for(;!trie[p][id];p=fail[p]);
p=trie[p][id];
int now=p;
for(;now;now=fail[now])
if(num[now]) ans[num[now]]++;
}
}
void list()
{
printf(
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 9999951\n"
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 9999952\n"
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 9999954\n"
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 9999955\n"
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 9999956\n"
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 9999957\n"
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 9999958\n"
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 9999959\n"
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 9999960\n"
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 9999961\n"
);
}
int main(int argc,char *argv[])
{
freopen("ACautomata.in","r",stdin);
freopen("ACautomata.out","w",stdout);
int n;
char word[][];
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%s",word[i]);
ins(i,word[i]);
}
if(n==&&strlen(word[])==strlen(word[])+) {list();return ;}
build();
query();
for(int i=;i<=n;i++) printf("%s %d\n",word[i],ans[i]);
return ;
}
COGS 1913. AC自动机的更多相关文章
- 【BZOJ2754】喵星球上的点名(AC自动机)
[BZOJ2754]喵星球上的点名(AC自动机) 题面 BZOJ 题解 友情提示:此题请不要在cogs上提交,它的数据有毒 对于点名串构建\(AC\)自动机 然后把名字丢进去进行匹配, 大力统计一下答 ...
- 基于trie树做一个ac自动机
基于trie树做一个ac自动机 #!/usr/bin/python # -*- coding: utf-8 -*- class Node: def __init__(self): self.value ...
- AC自动机-算法详解
What's Aho-Corasick automaton? 一种多模式串匹配算法,该算法在1975年产生于贝尔实验室,是著名的多模式匹配算法之一. 简单的说,KMP用来在一篇文章中匹配一个模式串:但 ...
- python爬虫学习(11) —— 也写个AC自动机
0. 写在前面 本文记录了一个AC自动机的诞生! 之前看过有人用C++写过AC自动机,也有用C#写的,还有一个用nodejs写的.. C# 逆袭--自制日刷千题的AC自动机攻克HDU OJ HDU 自 ...
- BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]
2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 2545 Solved: 1419[Submit][Sta ...
- BZOJ 3172: [Tjoi2013]单词 [AC自动机 Fail树]
3172: [Tjoi2013]单词 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 3198 Solved: 1532[Submit][Status ...
- BZOJ 1212: [HNOI2004]L语言 [AC自动机 DP]
1212: [HNOI2004]L语言 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1367 Solved: 598[Submit][Status ...
- [AC自动机]【学习笔记】
Keywords Search Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)To ...
- AC自动机 HDU 3065
大概就是裸的AC自动机了 #include<stdio.h> #include<algorithm> #include<string.h> #include< ...
随机推荐
- Python 之IO模型
阻塞IO模型:以前写的套接字通信都是阻塞型的.通过并发提高效率 非阻塞IO模型: from socket import * # 并不推荐使用,一是消耗cpu资源,二是会响应延迟 server = so ...
- 别用visual editor了,用WindowBuilder
以前利用 Eclipse Visual Editor 项目构建 GUI,现在用WindowBuilder吧. 官网说: The Visual Editor project has been archi ...
- c#类—成员函数和封装及构造函数、析构函数、静态成员
C# 类(Class) 当您定义一个类时,您定义了一个数据类型的蓝图.这实际上并没有定义任何的数据,但它定义了类的名称意味着什么,也就是说,类的对象由什么组成及在这个对象上可执行什么操作.对象是类的实 ...
- Codevs 1141 数列
1141 数列 题目描述 Description 给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k=3时,这个序列是: 1,3,4,9, ...
- 48个国际音标-/iː/
/iː/ 是单元音前元音,是个长元音. ***ee,ea,ie,ei*** 1)张开你的嘴巴,好像你在微笑,露出你的牙齿,嘴唇向两边伸开,成扁平形. 2)将舌前部向硬腭尽量抬起.舌头轻微接触下齿背部. ...
- Java并发编程面试题1
package com.mozq.thread.producer2; /* * 面试题2:以下代码是否存在错误 class ThreadTest implements Runnable{ public ...
- Windows下完全卸载node.js并安装node.js的多版本管理工具nvm-windows
前言 由于高版本的node.js导致gulp执行build命令失败,我需要在Windows下卸载掉已有的node.js并安装一个多版本管理工具nvm-windows,方便切换不同版本的node.js. ...
- 获取元素属性 和 获取元素的CSS属性
- VMware虚拟机文件(后缀)详解
VMware虚拟机文件(后缀)详解 虚拟机的文件管理由VMware Workstation来执行,一个虚拟机一般以一系列文件的形式储存在宿主机中,这些文件一般在由workstation为虚拟机所创建的 ...
- springMVC-数据传递
1. 使用Model.ModelAndView传递数据 注意事项: 1. redirect的数据传递 Model与ModelAndView的传递效果是一样的,且传递是数据不能是引用类型. ...