zoukankan      html  css  js  c++  java
  • hdu 1251 统计难题 字典树第一题。

    统计难题

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


    Problem Description
    Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).
     
    Input
    输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串.

    注意:本题只有一组测试数据,处理到文件结束.
     
    Output
    对于每个提问,给出以该字符串为前缀的单词的数量.
     
    Sample Input
    banana
    band
    bee
    absolute
    acm
     
    ba
    b
    band
    abc
     
    Sample Output
    2
    3
    1
    0
     
     1 /*
     2 字典树的模板题。
     3 */
     4 #include<iostream>
     5 #include<stdio.h>
     6 #include<cstring>
     7 #include<cstdlib>
     8 #include<algorithm>
     9 using namespace std;
    10 
    11 struct Tril
    12 {
    13     struct Tril *next[26];
    14     int v;
    15 };
    16 Tril *root;
    17 
    18 void mem(Tril *p)
    19 {
    20     int i;
    21     p->v=1;
    22     for(i=0;i<26;i++)
    23         p->next[i]=NULL;
    24 }
    25 void insert_Tril(char *c)
    26 {
    27     int i,len;
    28     Tril *p,*q;
    29     p=root;
    30     len=strlen(c+1);
    31     for(i=1;i<=len;i++)
    32     {
    33         if(p->next[c[i]-'a']==NULL)
    34         {
    35             q=(Tril*)malloc(sizeof(Tril));
    36             mem(q);
    37             p->next[c[i]-'a']=q;
    38             p=q;
    39         }
    40         else
    41         {
    42             p=p->next[c[i]-'a'];
    43             p->v++;
    44         }
    45     }
    46 }
    47 int found_Tril(char *c)
    48 {
    49     int len,i;
    50     Tril *p=root;
    51     len=strlen(c+1);
    52     for(i=1;i<=len;i++)
    53     {
    54         if(p->next[c[i]-'a']==NULL)
    55             return 0;
    56         p=p->next[c[i]-'a'];
    57     }
    58     return p->v;
    59 }
    60 void deal_Tril(Tril *p)
    61 {
    62     int i;
    63     for(i=0;i<26;i++)
    64     {
    65         if(p->next[i]==NULL)
    66         {
    67             free(p);
    68             continue;
    69         }
    70         else
    71             deal_Tril(p->next[i]);
    72     }
    73 }
    74 int main()
    75 {
    76     char a[50];
    77     int n;
    78     root= (Tril*)malloc(sizeof(Tril));
    79     mem(root);
    80     while(gets(a+1))
    81     {
    82         insert_Tril(a);
    83         while(gets(a+1))
    84         {
    85             n=strlen(a+1);
    86             if(n==0) break;
    87             insert_Tril(a);
    88         }
    89         while(gets(a+1))
    90         {
    91             printf("%d
    ",found_Tril(a));
    92         }
    93     }
    94     return 0;
    95 }
  • 相关阅读:
    HDOJ1024(最大M子段和)
    HDOJ1025(最长上升子序列)
    HDOJ1022(模拟栈)
    HDOJ(1018)
    HDOJ1238(string)
    HDOJ1015(简单深搜)
    HDOJ1016(标准dfs)
    Tabbar视图切换,返回上一视图,添加item
    页面转换方法
    网络状态判断
  • 原文地址:https://www.cnblogs.com/tom987690183/p/3567905.html
Copyright © 2011-2022 走看看