★★   输入文件: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自动机的更多相关文章

  1. 【BZOJ2754】喵星球上的点名(AC自动机)

    [BZOJ2754]喵星球上的点名(AC自动机) 题面 BZOJ 题解 友情提示:此题请不要在cogs上提交,它的数据有毒 对于点名串构建\(AC\)自动机 然后把名字丢进去进行匹配, 大力统计一下答 ...

  2. 基于trie树做一个ac自动机

    基于trie树做一个ac自动机 #!/usr/bin/python # -*- coding: utf-8 -*- class Node: def __init__(self): self.value ...

  3. AC自动机-算法详解

    What's Aho-Corasick automaton? 一种多模式串匹配算法,该算法在1975年产生于贝尔实验室,是著名的多模式匹配算法之一. 简单的说,KMP用来在一篇文章中匹配一个模式串:但 ...

  4. python爬虫学习(11) —— 也写个AC自动机

    0. 写在前面 本文记录了一个AC自动机的诞生! 之前看过有人用C++写过AC自动机,也有用C#写的,还有一个用nodejs写的.. C# 逆袭--自制日刷千题的AC自动机攻克HDU OJ HDU 自 ...

  5. BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]

    2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 2545  Solved: 1419[Submit][Sta ...

  6. BZOJ 3172: [Tjoi2013]单词 [AC自动机 Fail树]

    3172: [Tjoi2013]单词 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 3198  Solved: 1532[Submit][Status ...

  7. BZOJ 1212: [HNOI2004]L语言 [AC自动机 DP]

    1212: [HNOI2004]L语言 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1367  Solved: 598[Submit][Status ...

  8. [AC自动机]【学习笔记】

    Keywords Search Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)To ...

  9. AC自动机 HDU 3065

    大概就是裸的AC自动机了 #include<stdio.h> #include<algorithm> #include<string.h> #include< ...

随机推荐

  1. Bootstrap 轻量级后台管理系统模板--ACE使用介绍

    在上一篇基于Bootstrap介绍了一个免费的后台管理模板Charisma UI. 参见链接: 基于Jquery.Bootstrap的后台管理免费UI框架推荐--Charisma UI 今天继续分享一 ...

  2. codevs-1204

    1204 寻找子串位置 题目描述 Description 给出字符串a和字符串b,保证b是a的一个子串,请你输出b在a中第一次出现的位置. 输入描述 Input Description 仅一行包含两个 ...

  3. 【转】Visual Studio 选择相同变量高亮

    转:http://www.cnblogs.com/stone_w/p/3613760.html 前段时间一直在使用matlab,今天需要使用vs2008,而用惯了matlab,习惯了其中一项选中变量高 ...

  4. 萌新java入门笔记

    首先声明以下内容只是散乱笔记,如果有误还望大侠指出!不胜感激! 基本数据类型: 大体和C语言类似: boolean truth = true;//逻辑型 //文字型 char c; String st ...

  5. hoj2662 Pieces Assignment

    Pieces Assignment My Tags   (Edit)   Source : zhouguyue   Time limit : 1 sec   Memory limit : 64 M S ...

  6. [Xcode 实际操作]八、网络与多线程-(14)使用网址会话对象URLSession将地理坐标转换为地名

    目录:[Swift]Xcode实际操作 本文将演示如果通过网址会话对象,将地理坐标转换为地名. 网址会话对象URLSession具有在后台上传和下载.暂停和恢复网络操作.丰富的代理模式等优点. 在项目 ...

  7. (转)java 线程同步

    转自 http://blog.csdn.net/column/details/java-thread.html http://leo-faith.iteye.com/blog/177779 http: ...

  8. C - Aladdin and the Flying Carpet

    #include<bitset> #include<map> #include<vector> #include<cstdio> #include< ...

  9. mysql整理(个人)

    注意:以下命令都是在Linux系统下执行的: 1.验证mysql是否安装成功: mysqladmin --version 2.连接mysql服务器: mysql -u root -p 之后输入密码 3 ...

  10. 通过java调用Http接口上传图片到服务器

    https://blog.csdn.net/jaedons/article/details/78563841 /** * 测试上传png图片 * */ public static void testU ...