zoukankan      html  css  js  c++  java
  • HDOJ1251 统计难题 字典树的应用统计一组字符串中某前缀出现次数(字典树第一类应用),

    统计难题

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


    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 /* 功能Function Description:     HDOJ-1251 字典树
     2    开发环境Environment:          DEV C++ 4.9.9.1
     3    技术特点Technique:
     4    版本Version:
     5    作者Author:                   可笑痴狂
     6    日期Date:                      20120809
     7    备注Notes:
     8 */
     9 
    10 #include<stdio.h>
    11 #include<string.h>
    12 
    13 typedef struct node
    14 {
    15     int num;
    16     struct node *next[26];
    17 }node;
    18 
    19 node *T;
    20 node memory[1000000];//这里都用数组分配结点,用malloc分配太慢了,然后将内存一次赋给指针
    21 int k=0;      //指向未分配内存的数组下标
    22 
    23 void insert(char *s)
    24 {
    25     int i,j,len,id;
    26     node *p,*q;
    27     p=T;
    28     len=strlen(s);
    29     for(i=0;i<len;++i)
    30     {
    31         id=s[i]-'a';
    32         if(p->next[id]==NULL)
    33         {
    34             q=&memory[k++];
    35             q->num=0;
    36             for(j=0;j<26;++j)
    37                 q->next[j]=NULL;
    38             p->next[id]=q;
    39         }
    40         p=p->next[id];
    41         ++(p->num);
    42     }
    43 }
    44 
    45 int search(char *s)
    46 {
    47     int len,i,id;
    48     node *p;
    49     len=strlen(s);
    50     p=T;
    51     for(i=0;i<len;++i)
    52     {
    53         id=s[i]-'a';
    54         if(p->next[id]==NULL)
    55             return 0;
    56         p=p->next[id];
    57     }
    58     return p->num;
    59 }
    60 
    61 int main()
    62 {
    63     int i;
    64     char s[15];
    65     T=&memory[k++];       //获取数组中的内存
    66     for(i=0;i<26;++i)     //头指针初始化
    67         T->next[i]=NULL;
    68     while(gets(s)&&s[0]!='\0')  //注意这里用scanf的话输出空行时跳不出循环,必须使用gets
    69     {
    70         insert(s);
    71     }
    72     while(scanf("%s",s)!=EOF)
    73         printf("%d\n",search(s));
    74     return 0;
    75 }
    功不成,身已退
  • 相关阅读:
    Informix数据表结构分析资料整理之字段类型说明和查询SQL语句
    Informix数据表结构分析资料整理之约束查询代码
    C#调用C++的DLL搜集整理的所有数据类型转换方式
    CentOS 6.3安装Puppet3.x
    linux的initrd.img的解压和打包
    Linux时间修改CentOS/Redhat
    Linux内核升级Broadcom网卡问题(bnx2)
    CentOS5.8下编译安装3.X版本内核
    使用KVM创建Windows系统镜像
    CentOS6.3安装RTL8188CE无线网卡驱动
  • 原文地址:https://www.cnblogs.com/dongsheng/p/2630552.html
Copyright © 2011-2022 走看看