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. [Android界面] 这样的选择器怎么实现?? 充值选择

    1  充值的或年纪的 或  1 先讲例子 http://blog.csdn.net/lmj623565791/article/details/48393217: 本文出自:[张鸿洋的博客] 一.概述 ...

  2. script标签块的独立性与共享性

    块间独立,变量与方法共享 每个script块之间不会相互影响,某个script块出错,不会影响其它块的运行 块之间定义的非局部变量和方法可以共享,(其实只是共享了全局变量和方法) <script ...

  3. 在Android下运行Linux平台编译的程序

    编译时需注意使用 -static 编译选项: 否则会提示运行:/system/bin/sh: ./i2c: No such file or directory

  4. tmux protocol version mismatch (client 7, server 6)

    $ tmux attach protocol version mismatch (client 7, server 6) $ pgrep tmux 3429 $ /proc/3429/exe atta ...

  5. 关于Linux session管理与GUI架构

    google了一下感觉一下子找不到太好的资料,可能需要慢慢深入去学习. 这里有一个讲session management的,还算比较深入: https://dvdhrm.wordpress.com/2 ...

  6. SAP的运输功能(转)

    SAP的运输功能(transportation)  transportation大体有三个作用: 1.运输计划transportation planning 概念:对outbound delivery ...

  7. 网络安装archlinux(2012.8.20)笔记

    周末闲极无聊,把烂笔记本翻出来想装个Archlinux,发现USB不能启动,光驱也挂了,只好网络安装. 我先后试了两种安装方式,一种纯互联网启动,安装,一种局域网启动,再互联网安装.分别说说. 不管哪 ...

  8. NPM私有服务器架设 FOR CentOS

    确保计算机能够连接互连网. 一.安装 Couchdb1.6 1.(CentOS 6.7)如果版本低于6.7请使用下面命令更新系统库. yum update 2.使用下面命令安装依赖库 yum inst ...

  9. oracle 查询月份差

    select to_char(add_months(trunc(sysdate),-1),'yyyymm') from dual;

  10. html5[1]:优化Android Webview性能

    尽量少用position:relative 做一个OTO项目时,页面上下滑动时,颤抖的很厉害: 页面中主要是图片比较多,开始以为是图片多的原因,但是把所有图片都不加载,还是颤抖: 后来,去掉所有外部的 ...