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(同下)

  1. #include <iostream>
  2. #include <string.h>
  3. #include <stdio.h>
  4. #include <malloc.h>
  5. using namespace std;
  6. char str[];
  7. const int maxn=;//孩子节点的最大个数,如果是只有26个字母,就用26就可以了。
  8.  
  9. struct Trie//树的结构体
  10. {
  11. int cnt;//保存某个字母出现的次数
  12. Trie *next[maxn];//每一个节点对应着多少个孩子,如果只有26个字母,就用26就可以了
  13. };
  14.  
  15. Trie root;
  16.  
  17. /*void init(Trie t)
  18. {
  19. for(int i=0;i<26;i++)
  20. t.next[i]=NULL;
  21. }*///不需要单独对根节点初始化
  22.  
  23. void CreateTrie(char *str)
  24. {
  25. int len=strlen(str);
  26. Trie *p=&root,*q;
  27. for(int i=;i<len;i++)
  28. {
  29. int id=str[i]-'a';
  30. if(p->next[id]==NULL)//第一次遇到
  31. {
  32. q=(Trie*)malloc(sizeof(Trie));
  33. q->cnt=;//此处一开始写错,写成了q->cnt++;
  34. for(int i=;i<maxn;i++)
  35. q->next[i]=NULL;//初始化非空节点的孩子节点
  36. p->next[id]=q;//在树中填上
  37. p=p->next[id];//此时的P是不为空的节点
  38. }
  39. else
  40. {
  41. p->next[id]->cnt++;//不是第一次遇到,个数++
  42. p=p->next[id];
  43. }
  44. }
  45. }
  46.  
  47. int find(char *str)
  48. {
  49. int len=strlen(str);
  50. Trie *p=&root;
  51. for(int i=;i<len;i++)
  52. {
  53. int id=str[i]-'a';
  54. p=p->next[id];//一直向下走。
  55. if(p==NULL)//找不到该单词,一开始此处写错了,写成了p->next[id]==NULL
  56. return ;
  57. }
  58. return p->cnt;
  59. }
  60. int main()
  61. {
  62. while(gets(str)&&str[]!='\0')
  63. {
  64. CreateTrie(str);
  65. }
  66. while(scanf("%s",str)!=EOF)
  67. {
  68. printf("%d\n",find(str));
  69. }
  70. return ;
  71. }
  72.  
  73. 我的代码(测试样例能过,提交过不了):
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. using namespace std;
  5. const int NODE=1e5+,CH=;
  6. int ch[NODE][CH],sz,val[NODE],cal[NODE][CH];
  7.  
  8. int idx(char c)
  9. {
  10. return c-'a';
  11. }
  12.  
  13. int node()
  14. {
  15. memset(ch[sz],,sizeof(ch[sz]));
  16. val[sz]=;
  17. return sz++;
  18. }
  19.  
  20. void init()
  21. {
  22. sz=;
  23. node();
  24. }
  25.  
  26. void insert(char *s,int v)
  27. {
  28. int u=;
  29. for(;*s;s++)
  30. {
  31. int c=idx(*s);
  32. if(!ch[u][c])
  33. ch[u][c]=node();
  34. else
  35. cal[u][c]++;
  36.  
  37. u=ch[u][c];
  38. }
  39. val[u]=v;
  40. }
  41.  
  42. int main()
  43. {
  44. int ca=;
  45. char k[],*s;
  46. init();
  47. memset(cal,,sizeof(cal));
  48. while()
  49. {
  50. gets(k);
  51. if(strcmp(k,"\0")==)
  52. break;
  53. insert(k,ca++);
  54. }
  55.  
  56. while(scanf("%s",k)!=NULL)
  57. {
  58. s=k;
  59. int c,x=,u=,flag=;
  60. for(;*s;s++)
  61. {
  62. c=idx(*s);
  63. u=x;
  64. if(!ch[u][c])
  65. {
  66. flag=;
  67. break;
  68. }
  69. else
  70. x=ch[u][c];
  71. }
  72. if(flag)
  73. printf("0\n");
  74. else
  75. printf("%d\n",cal[u][c]+);
  76. }
  77. return ;
  78. }
  1.  
  1.  

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. 使用proxool 连接池:No suitable driver found for proxool

    使用proxool连接池时:报错误No suitable driver found for proxool.shide的原因: ①.WEB-INF目录下的lib中没有proxool连接池jar驱动包. ...

  2. PowerShell实现文件下载(类wget)

    对Linux熟悉的读者可能会对Linux通过wget下载文件有印象,这个工具功能很强大,在.NET环境下提到下载文件大多数人熟悉的是通过System.Net.WebClient进行下载,这个程序集能实 ...

  3. idea使用maven启动tomcat

    1.设置tomcat,如图: 2.添加war包 3.修改pom.xml 删除可能的选项,如果有下面的代码,删除掉 4.选择使用的resources目录 5.启动即可

  4. JDK的下载、安装及环境变量的配置

    官网下载JDK: www.oracle.com 或者 www.java.sun.com   安装JDK: 双击运行下载的 jdk-8u25-windows-i586.exe即可. 假设安装目录为:D: ...

  5. oracle rac理解和用途扩展

    Oracle RAC的优势在于利用多个节点(数据库实例)组成一个数据库,这样在保证了数据库高可用性的情况下更充分的利用了多个主机的性能,而且可以通过增加节点进行性能的扩展.实现Oracle RAC需要 ...

  6. 实战android菜单项之XML加载菜单与动态菜单项[转]

    原文地址:http://blog.csdn.net/kaiwii/article/details/7767225 自定义android应用程序的菜单项首先要知道切入点.经过学习,知道主要是两个Acti ...

  7. SNF开发平台WinForm之五-高级查询使用说明-SNF快速开发平台3.3-Spring.Net.Framework

    5.1运行效果: 5.2开发实现: 1.按上面效果来说,先来看一下在程序当中如果调用.第一步在页面拖拽一个按钮为“高级查询”,事件上写下如下代码: 如果是单表查询的话,只需要传GridView就行,如 ...

  8. ubuntu remove mysql

    ubuntu 彻底删除 mysql 然后重装 mysql 删除 mysql sudo apt-get autoremove --purge mysql-server-5.0sudo apt-get r ...

  9. MongoDB 安装记录

    之前使用一直没记录,防再次掉坑,记录下 echo 开始 D: cd D:\Program Files\MongoDB\Server\3.2\bin mongod --install --service ...

  10. B2B多商铺初期权限数据库设计

    项目从无到有,两个月了.一期完成. 权限目前还很简单.USER表,ROLE表,RESOURCE表三个. 目前只有两个商铺.id是0的是我们自己,作为后台运维管理,也抽象成一个商铺,id为0.另一个商铺 ...