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 ...
随机推荐
- C语言函数可变长度参数剖析
C语言中的很多函数的入参被定义为可变参数,最典型的 int printf (const char * fmt, ...) 要对其中的可变参数进行处理,就要用到va_list类型和 VA_START, ...
- [原]quick2.25让描边闪起来
本文教大家如何使用shader让描边动起来.实质就是间隔一定时间改变描边的颜色.难点:如何通过程序把颜色传给shader.想在quick2.25里面尝试的朋友,参考quick2.25精灵变灰配置一下环 ...
- SQL2008数据库优化常用脚本
--查询某个数据库的连接数 select count(*) from Master.dbo.SysProcesses where dbid=db_id() --前10名其他等待类型 SELECT TO ...
- NSURLSession与AFNetworking3.0
下面是用GET方式请求一个页面数据的示例: AFNetworking 2.x NSString *siteUrl = @"http://webinar.ofweek.com/readDemo ...
- ux.form.field.SearchField 列表、树形菜单查询扩展
//支持bind绑定store //列表搜索扩展,支持本地查询 //支持树形菜单本地一级菜单查询 Ext.define('ux.form.field.SearchField', { extend: ' ...
- windbg入门
1.下载安装windbg Windows 10 调试工具 (WinDbg) 如果你仅需要 Windows 10 调试工具,而不需要 WDK 10 或 Visual Studio 2015,你可以将调试 ...
- ActionBarSherlock SlidingMenu整合,解决SlidingMenu example的getSupportActionBar()方法不能用问题
今天下载了SlidingMenu来研究,发现里面那个自带的example不能使用,总是提示BaseActivity 里面找不到getSupportActionBar()方法,到Github上面一查果然 ...
- Linux高级编程--07.进程间通信
每个进程各自有不同的用户地址空间,进程之间要交换数据必须通过在内核中开辟缓冲区,从而实现数据共享. 管道 管道是一种最基本的IPC机制,由pipe函数创建: int pipe(int filedes[ ...
- java中三种方式获得类的字节码文件对象
package get_class_method; public class ReflectDemo { /** * @param args */ public static void main(St ...
- ionic 添加应用图标与启动页
由于手机有很多不同的尺寸与版本,所以图标尺寸也是大小不一,但是如果手动每一个尺寸都制作一个图标,那估计美工会吐血吧,不过幸好,ionic只需要一个图标就可以制作不同尺寸的图标. 添加一个ionic项目 ...