Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2794312
  • 博文数量: 471
  • 博客积分: 7081
  • 博客等级: 少将
  • 技术积分: 5369
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-04 21:55
文章分类

全部博文(471)

文章存档

2014年(90)

2013年(69)

2012年(312)

分类: C/C++

2012-04-19 11:36:50

Problem Description

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

Input

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

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

Output

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

链接:

点击(此处)折叠或打开

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<stdlib.h>
  4. struct node
  5. {
  6.     int count ;
  7.     struct node *next[26];//定义26个分节点
  8. };
  9. struct node *root;
  10. struct node *build()//建立节点
  11. {
  12.     struct node *p;
  13.     p=(struct node *)malloc(sizeof(struct node));
  14.     for(int i=0;i<26;i++)
  15.     {
  16.         p->next[i]=NULL;//令其指向0;
  17.     }
  18.         p->count=1;/*如果出现这个站点,那么它的次数肯定是大于等于1的。
  19.         但是我们刚开始建立不必考虑后续问题*/
  20.     return p;//返回新建立的节点
  21. }
  22. void save(char *s)//储存字母
  23. {
  24.     int len=strlen (s);
  25.     if(len==0)return ;
  26.     struct node *p;
  27.     p=root;
  28.     for(int i=0;i<len;i++)
  29.         if(p->next[s[i]-'a']!=NULL)
  30.             /*如果这个节点之前就已经存在呃,我们只需要把统计次数加上1.*/
  31.         {
  32.             p=p->next[s[i]-'a'];
  33.             p->count=p->count+1;
  34.         }
  35.         else//如果不存在的话,我们就建立一个新的节点
  36.         {
  37.             p->next[s[i]-'a']=build();
  38.             p=p->next[s[i]-'a'];
  39.         }
  40. }
  41. int seach (char *s)//这个函数来查询数据
  42. {
  43.     struct node *p;
  44.     int len=strlen(s);
  45.     if(len==0)return 0;
  46.     p=root;//此处小心
  47.     for(int i=0;i<len ;i++)
  48.     {
  49.         if(p->next[s[i]-'a']!=NULL)//说明还有下个节点,继续查询
  50.             p=p->next[s[i]-'a'];
  51.         else
  52.             return 0;
  53.         /*如果没有指向下个节点,说明这个要查询的字符串根本不存在,直接返回0*/
  54.     }
  55.     return p->count;
  56. }
  57. int main()
  58. {
  59.     char str[15];
  60.     int ans;
  61.     root=build();
  62.     while(gets(str)&&str[0]!='\0')//不输入直接一个Enter,那个这个字符串相当'\0';
  63.         save(str);
  64.     while(scanf("%s",str)!=EOF)
  65.     {
  66.         ans=seach(str);
  67.         printf("%d\n",ans);
  68.     }
  69.     return 0;
  70. }

阅读(2329) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~