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 ...
随机推荐
- 使用proxool 连接池:No suitable driver found for proxool
使用proxool连接池时:报错误No suitable driver found for proxool.shide的原因: ①.WEB-INF目录下的lib中没有proxool连接池jar驱动包. ...
- PowerShell实现文件下载(类wget)
对Linux熟悉的读者可能会对Linux通过wget下载文件有印象,这个工具功能很强大,在.NET环境下提到下载文件大多数人熟悉的是通过System.Net.WebClient进行下载,这个程序集能实 ...
- idea使用maven启动tomcat
1.设置tomcat,如图: 2.添加war包 3.修改pom.xml 删除可能的选项,如果有下面的代码,删除掉 4.选择使用的resources目录 5.启动即可
- JDK的下载、安装及环境变量的配置
官网下载JDK: www.oracle.com 或者 www.java.sun.com 安装JDK: 双击运行下载的 jdk-8u25-windows-i586.exe即可. 假设安装目录为:D: ...
- oracle rac理解和用途扩展
Oracle RAC的优势在于利用多个节点(数据库实例)组成一个数据库,这样在保证了数据库高可用性的情况下更充分的利用了多个主机的性能,而且可以通过增加节点进行性能的扩展.实现Oracle RAC需要 ...
- 实战android菜单项之XML加载菜单与动态菜单项[转]
原文地址:http://blog.csdn.net/kaiwii/article/details/7767225 自定义android应用程序的菜单项首先要知道切入点.经过学习,知道主要是两个Acti ...
- SNF开发平台WinForm之五-高级查询使用说明-SNF快速开发平台3.3-Spring.Net.Framework
5.1运行效果: 5.2开发实现: 1.按上面效果来说,先来看一下在程序当中如果调用.第一步在页面拖拽一个按钮为“高级查询”,事件上写下如下代码: 如果是单表查询的话,只需要传GridView就行,如 ...
- ubuntu remove mysql
ubuntu 彻底删除 mysql 然后重装 mysql 删除 mysql sudo apt-get autoremove --purge mysql-server-5.0sudo apt-get r ...
- MongoDB 安装记录
之前使用一直没记录,防再次掉坑,记录下 echo 开始 D: cd D:\Program Files\MongoDB\Server\3.2\bin mongod --install --service ...
- B2B多商铺初期权限数据库设计
项目从无到有,两个月了.一期完成. 权限目前还很简单.USER表,ROLE表,RESOURCE表三个. 目前只有两个商铺.id是0的是我们自己,作为后台运维管理,也抽象成一个商铺,id为0.另一个商铺 ...