HDUOJ-----(1251)统计难题

统计难题

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others) Total Submission(s): 14434    Accepted Submission(s): 6219

Problem Description

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

Input

输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串. 注意:本题只有一组测试数据,处理到文件结束.

Output

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

Sample Input

banana

band

bee

absolute

acm

ba

b

band

abc

Sample Output

2

3

1

0

Author

Ignatius.L

Recommend

Ignatius.L

     字典树.....

代码:

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 
 5 typedef struct trie
 6 {
 7     //由于只有小写字母a~z-->26
 8     struct trie *child[26];
 9     int deep;  //--->相似的程度
10 }Trie;
11 
12 /*作为一个头指针*/
13 
14 Trie *root;
15 
16 void Insert(char *a)
17 {
18     int len,i;
19     Trie *current, *creatnew;
20     len=strlen(a);
21     if(len)
22     {
23              current=root;
24         for(i=0;i<len;i++)
25         {
26           if(current->child[a[i]-'a']!=0)
27           {
28              current=current->child[a[i]-'a'];
29              current->deep=current->deep+1;
30           }
31           else
32           {
33               creatnew=(Trie *)malloc(sizeof(Trie));
34              for(int j=0;j<26;j++)
35              {
36                 creatnew->child[j]=0;
37              }
38               current->child[a[i]-'a']=creatnew;
39               current=creatnew;
40               current->deep=1;
41           }
42         }
43     }
44 }
45 
46 
47 int Triefind(char *a)
48 {
49    int i,len;
50    Trie *current;
51    len=strlen(a);
52    if(!len) return 0;
53    current=root;
54    for(i=0;i<len;i++)
55    {
56        if(current->child[a[i]-'a']!=0)
57        {
58          current=current->child[a[i]-'a'];
59        }
60        else
61             return 0;
62    }
63     return current->deep;
64 }
65 
66 int main()
67 {
68     int i;
69     char temp[12];
70     root=(Trie *)malloc(sizeof(Trie));
71     for(i=0;i<26;i++)
72     {
73         root->child[i]=0;
74     }
75     root->deep=2;
76     while(gets(temp),strcmp(temp,""))
77         Insert(temp);
78      memset(temp,'\0',sizeof(temp));
79     while(~scanf("%s",temp))
80       printf("%d\n",Triefind(temp));
81    free(root);    
82     return 0;
83 }
84 
85   

 模板:

代码:

 1 /*hdu 1251 字典树之统计*/
 2 #define LOCAL
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<cstdlib>
 6 typedef struct Trie
 7 {
 8  struct Trie *child[26];
 9  int deep;
10 }trie;
11 
12 int idx(char s){
13     return s-'a';
14 }
15 void Insert(char *s,trie *root)
16 {
17    trie *cur,*newcur;
18     cur=root;
19     int i,j;
20    for(i=0;s[i]!='\0';i++)
21    {
22       if(cur->child[idx(s[i])]==NULL)  //为空指针
23       {
24          newcur=(trie *)malloc(sizeof(trie));
25          newcur->deep=0;
26          for(j=0;j<26;j++)
27            newcur->child[j]=NULL; //设置为空指针
28           cur->child[idx(s[i])]=newcur;
29       }
30       cur=cur->child[idx(s[i])];  //向下推一层
31       cur->deep+=1;   //层数加一
32    }
33 }
34 int query(char *s,trie *root)
35 {
36     trie *cur=root;
37     int i;
38     for(i=0;s[i]!='\0';i++){
39         if(cur->child[idx(s[i])]!=NULL)
40             cur=cur->child[idx(s[i])];
41         else
42             return 0;
43     }
44     int tem=cur->deep;
45     return tem;
46 }
47 void del(trie *root)
48 {
49     int i=0;
50     for(i=0;i<26;i++){
51      if(root->child[i]!=NULL)
52        del(root->child[i]);
53     }
54    free(root);
55 }
56 char ss[12];
57 int main()
58 {
59 #ifdef LOCAL
60   freopen("test.in","r",stdin);
61 #endif
62   trie *root=(trie *)malloc(sizeof(trie));
63   for(int i=0;i<26;i++)
64     root->child[i]=NULL;  //设置为空指针
65    while(gets(ss),strcmp(ss,""))
66     Insert(ss,root);
67    while(scanf("%s",ss)!=EOF)
68      printf("%d\n",query(ss,root));
69      del(root);
70  return 0;
71 }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏猿人谷

【不做标题党,只做纯干货】HashMap在jdk1.7和1.8中的实现

Java集合类的源码是深入学习Java非常好的素材,源码里很多优雅的写法和思路,会让人叹为观止。HashMap的源码尤为经典,是非常值得去深入研究的,jdk1....

11930
来自专栏算法修养

HDU 5701 中位数计数 百度之星初赛

中位数计数 Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (J...

27160
来自专栏TensorFlow从0到N

讨厌算法的程序员 5 - 合并算法

本篇介绍的“合并”算法,是为后面学习“归并排序”的一个准备。合并算法是归并排序中的一个子算法,请注意两者之间的关系和差异。 之所以把它独立成一篇,一方面是一旦...

35750
来自专栏程序员叨叨叨

5.3 结构类型

Cg 语言支持结构体(structure),实际上 Cg 中的结构体的声明、使用和 C++ 非常类似(只是类似,不是相同)。一个结构体相当于一种数据类型,可以定...

6120
来自专栏偏前端工程师的驿站

基础野:细说浮点数

Brief                                 本来只打算理解JS中0.1 + 0.2 == 0.30000000000000004...

22290
来自专栏编舟记

泛型编程

泛型编程是一种编程风格,其中算法以尽可能抽象的方式编写,而不依赖于将在其上执行这些算法的数据形式。

9720
来自专栏软件开发

C语言 经典编程100题

一、题目 【程序1】 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? ===========================...

2.7K80
来自专栏计算机视觉与深度学习基础

Leetcode 134 Gas Station

There are N gas stations along a circular route, where the amount of gas at sta...

21150
来自专栏小樱的经验随笔

2017 Multi-University Training Contest - Team 1 1002&&HDU 6034 Balala Power!【字符串,贪心+排序】

Balala Power! Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131...

29050
来自专栏算法修养

POJ-2346 Lucky tickets(线性DP)

Lucky tickets Time Limit: 1000MS Memory Limit: 65536K Total Submissions...

25870

扫码关注云+社区

领取腾讯云代金券