AC自动机(1)
Description
Input
注意:本题只有一组测试数据,处理到文件结束.
Output
Sample Input
band
bee
absolute
acm
ba
b
band
abc
Sample Output
3
1
0
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <malloc.h>
using namespace std;
char str[];
const int maxn=;//孩子节点的最大个数,如果是只有26个字母,就用26就可以了。 struct Trie//树的结构体
{
int cnt;//保存某个字母出现的次数
Trie *next[maxn];//每一个节点对应着多少个孩子,如果只有26个字母,就用26就可以了
}; Trie root; /*void init(Trie t)
{
for(int i=0;i<26;i++)
t.next[i]=NULL;
}*///不需要单独对根节点初始化 void CreateTrie(char *str)
{
int len=strlen(str);
Trie *p=&root,*q;
for(int i=;i<len;i++)
{
int id=str[i]-'a';
if(p->next[id]==NULL)//第一次遇到
{
q=(Trie*)malloc(sizeof(Trie));
q->cnt=;//此处一开始写错,写成了q->cnt++;
for(int i=;i<maxn;i++)
q->next[i]=NULL;//初始化非空节点的孩子节点
p->next[id]=q;//在树中填上
p=p->next[id];//此时的P是不为空的节点
}
else
{
p->next[id]->cnt++;//不是第一次遇到,个数++
p=p->next[id];
}
}
} int find(char *str)
{
int len=strlen(str);
Trie *p=&root;
for(int i=;i<len;i++)
{
int id=str[i]-'a';
p=p->next[id];//一直向下走。
if(p==NULL)//找不到该单词,一开始此处写错了,写成了p->next[id]==NULL
return ;
}
return p->cnt;
}
int main()
{
while(gets(str)&&str[]!='\0')
{
CreateTrie(str);
}
while(scanf("%s",str)!=EOF)
{
printf("%d\n",find(str));
}
return ;
} 我的代码(测试样例能过,提交过不了):
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int NODE=1e5+,CH=;
int ch[NODE][CH],sz,val[NODE],cal[NODE][CH]; int idx(char c)
{
return c-'a';
} int node()
{
memset(ch[sz],,sizeof(ch[sz]));
val[sz]=;
return sz++;
} void init()
{
sz=;
node();
} void insert(char *s,int v)
{
int u=;
for(;*s;s++)
{
int c=idx(*s);
if(!ch[u][c])
ch[u][c]=node();
else
cal[u][c]++; u=ch[u][c];
}
val[u]=v;
} int main()
{
int ca=;
char k[],*s;
init();
memset(cal,,sizeof(cal));
while()
{
gets(k);
if(strcmp(k,"\0")==)
break;
insert(k,ca++);
} while(scanf("%s",k)!=NULL)
{
s=k;
int c,x=,u=,flag=;
for(;*s;s++)
{
c=idx(*s);
u=x;
if(!ch[u][c])
{
flag=;
break;
}
else
x=ch[u][c];
}
if(flag)
printf("0\n");
else
printf("%d\n",cal[u][c]+);
}
return ;
}
AC自动机(1)的更多相关文章
- 基于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< ...
- AC自动机 HDU 2896
n个字串 m个母串 字串在母串中出现几次 #include<stdio.h> #include<algorithm> #include<string.h> #inc ...
- 【BZOJ-3881】Divljak AC自动机fail树 + 树链剖分+ 树状数组 + DFS序
3881: [Coci2015]Divljak Time Limit: 20 Sec Memory Limit: 768 MBSubmit: 508 Solved: 158[Submit][Sta ...
随机推荐
- openssl 学习之从证书中提取RSA公钥N 和 E
原文链接: http://blog.csdn.net/kkxgx/article/details/19850509 通常数字证书包含很多信息,其中N和E值即我们称为的公钥.如何从PEM 或者DER格式 ...
- Xcode 文档注释方法
摘自:http://www.cnblogs.com/bomo/p/4815963.html 文档注释,可以在调用时显示注释信息,让调用者更好的理解方法的用途. 注释方法: /// 注释 和 /** 注 ...
- (转)2G到C-RAN网络架构的演进
这是我一个学霸师弟写的一篇知识普及的文章,涉及到的知识结构很全面,很丰富,对网络通信技术感兴趣的童鞋可以看看,内容我就不贴过来了,直接到他博客上去看吧. 2G到C-RAN网络结构演进
- ux.form.field.Verify 验证码控件
//验证码控件 Ext.define('ux.form.field.Verify', { extend: 'Ext.container.Container', alias: ['widget.fiel ...
- POJ 2234 Matches Game
Matches Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7567 Accepted: 4327 Desc ...
- tomcat的网站屏蔽IP的方法
<Host> <Valve className="org.apache.catalina.valves.RemoteAddrValve" deny=" ...
- cakePHP的controller回调
1. afterFilter(), executed after all controller logic, including the rendering of the view2. beforeF ...
- [原]零基础学习在Android进行SDL开发系列文章
[原]零基础学习SDL开发之移植SDL2.0到Android [原]零基础学习SDL开发之在Android使用SDL2.0显示BMP图 [原]零基础学习SDL开发之在Android使用SDL2.0显示 ...
- [原]SQLite的学习系列之获取数据库版本二
本系列文章主要是使用C++语言来调用其API,达到管中窥豹的目的.另外本文使用的开发环境为mac + clion,并且基于SQLite 3.7.14来进行开发. 一.去下载sqlite-amalgam ...
- VirtualBox Bridged 无线网卡
启动虚拟机后选择右键单击右下角的网络链接图标, 弹出的窗口中选择Bridged Adapter, wlan0 然后选择OK 查看virtual Box主页面中setting中网络的配置是否和刚才一 ...