• 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,'',sizeof(temp));
    79     while(~scanf("%s",temp))
    80       printf("%d
    ",Triefind(temp));
    81    free(root);    
    82     return 0;
    83 }
    84 
    85   
    View Code

     模板:

    代码:

     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]!='';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]!='';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
    ",query(ss,root));
    69      del(root);
    70  return 0;
    71 }
    View Code
  • 相关阅读:
    ORACLE表空间操作(转)
    ORA12514错误解决方法
    ETL工具 kettle问题
    改变oracle端口号
    查询SQL Server中所有数据库的数据文件位置
    使用URTracker构建企业IT服务平台
    那些年,我做共享软件(2)
    那些年,我做共享软件(1)
    那些年,我做共享软件(3)完结
    浅析缺陷管理系统URTracker
  • 原文地址:https://www.cnblogs.com/gongxijun/p/3377693.html
Copyright © 2020-2023  润新知