Description

Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀). 
 

Input

输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串.

注意:本题只有一组测试数据,处理到文件结束.

 

Output

对于每个提问,给出以该字符串为前缀的单词的数量. 
 

Sample Input

banana
band
bee
absolute
acm

ba
b
band
abc

 

Sample Output

2
3
1
0
 
链接好的代码(结构体):http://m.blog.csdn.net/blog/sr19930829/26866069(同下)

#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)的更多相关文章

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

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

  2. AC自动机-算法详解

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

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

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

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

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

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

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

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

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

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

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

  8. AC自动机 HDU 3065

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

  9. AC自动机 HDU 2896

    n个字串 m个母串 字串在母串中出现几次 #include<stdio.h> #include<algorithm> #include<string.h> #inc ...

  10. 【BZOJ-3881】Divljak AC自动机fail树 + 树链剖分+ 树状数组 + DFS序

    3881: [Coci2015]Divljak Time Limit: 20 Sec  Memory Limit: 768 MBSubmit: 508  Solved: 158[Submit][Sta ...

随机推荐

  1. struts2:异常处理

    Struts2框架提供了自己的异常处理机制,只需要在struts.xml文件中配置异常处理即可,而不需要在Action方法中来捕捉异常. 传统方法 public String execute() th ...

  2. IOS开发 图形绘制,绘制线条,矩形,和垂直和居中绘制文字

    概述 吐槽下IOS下 的图形绘图,代码冗长,不得不自己重新封装方法.整理形成本文. 绘制线 // 绘制直线 + (void)toDrawLineFromX:(CGFloat)x1 Y:(CGFloat ...

  3. Spark源码系列(八)Spark Streaming实例分析

    这一章要讲Spark Streaming,讲之前首先回顾下它的用法,具体用法请参照<Spark Streaming编程指南>. Example代码分析 val ssc = )); // 获 ...

  4. 高性能优化Web前端

    高性能HTML 一.避免使用iframe iframe也叫内联frame,可将一个HTML文档嵌入另一个HTML文档中. iframe的好处是,嵌入的文档独立于父文档,通常也借此使浏览器模拟多线程.缺 ...

  5. 如果你遇到,在IntelliJ IDEA里Ctrl+Alt+方向键用不了

    在idea中使用ctrl+b跟踪进入函数之后,每次返回都不知道用什么快捷键,在idea中使用ctrl+alt+方向键首先会出现与win7屏幕方向的快捷键冲突,右键桌面,选择图形属性,将win7的快捷键 ...

  6. Xcode 安装插件手误选择了「Skip Bundle」后需要重新允许「Load Bundle」的解决方法

    在 Mac 终端输入命令: # 这里的7.1代表 Xcode 的版本号 defaults delete com.apple.dt.Xcode DVTPlugInManagerNonApplePlugI ...

  7. windows下配置nginx+php

    [转] http://www.cnblogs.com/fengyuqing/p/php_nginx.html 1.首先需要准备的应用程序包. nginx:nginx/Windows-1.0.4 php ...

  8. oracle 语句创建表空间、用户、授权

    /*分为四步 */ /*第1步:创建临时表空间 */ create temporary tablespace yuhang_temp tempfile 'D:\oracledata\yuhang_te ...

  9. VMware下OS X Yosemite安装VMsvga2桌面黑屏解决方法

    VMsvga2目前并不支持Yosemite,如果安装的话进入桌面除了顶部菜单,全部黑屏.通过顶部菜单打开的大部分应用都会立刻奔溃关闭.参考以下步骤可以解决问题: 1.下载VMsvga2的uninsta ...

  10. 惊涛怪浪(double dam-break) -- position based fluids

    切入正题之前,先胡说八道几句.    据说爱因斯坦讲过:关于这个世界最难以理解的就是它是可以被理解的.人类在很长的时间里,都无法认知周围变幻莫测的世界,只能编造出无数的神祗来掌控世上万物的运行.到了近 ...