• hdu1251(字典树)


    统计难题

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


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

    注意:本题只有一组测试数据,处理到文件结束.
     
    Output
    对于每个提问,给出以该字符串为前缀的单词的数量.
     
    Sample Input
    banana
    band
    bee
    absolute
    acm
     
    ba
    b
    band
    abc
     
    Sample Output
    2
    3
    1
    0
     

    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    using namespace std;
    struct dictree
    {
        struct dictree *child[26];
        int n;
    };
    struct dictree *root;
    void insert(char *source)
    {
        int i,j;
        int len,id;
        struct dictree *current,*newnode;
        len=strlen(source);
        current=root;
        for(i=0; i<len; i++)
        {
            id=source[i]-'a';
            if(current->child[id]!=0)
            {
                current=current->child[id];
                current->n++;
            }
            else
            {
                newnode=(struct dictree *)malloc(sizeof(struct dictree));
                for(j=0; j<26; j++)
                    newnode->child[j]=0;
                current->child[id]=newnode;
                current=newnode;
                current->n=1;
            }
        }
    }
    int find(char *source)
    {
        int i,id;
        int len;
        struct dictree *current;
        len=strlen(source);
        if(len==0)
            return 0;
        current=root;
        for(i=0; i<len; i++)
        {
            id=source[i]-'a';
            if(current->child[id]!=0)
                current=current->child[id];
            else
                return 0;
        }
        return current->n;
    }
    int main()
    {
        char temp[11];
        int i;
        root=(struct dictree *)malloc(sizeof(struct dictree));
        for(i=0; i<26; i++)
        root->child[i]=0;
        root->n=0;
        while(gets(temp),strcmp(temp,"")!=0)
            insert(temp);
        while(gets(temp)!=0)
            printf("%d ",find(temp));
        return 0;

    }

  • 相关阅读:
    dp的小理解
    POJ
    isolate-user-vlan隔离用户vlan的配置
    【mvrp多协议vlan注册协议给予三种注册方式的验证】
    【Commare中关于理论范畴和技术常用的技术术语】
    BGP映射和联盟
    filter-policy和AS-PATH-FILTER过滤BGP路由条目
    【路由过滤工具小结】
    【ISIS(中间系统到中间系统)路由链路状态信息协议初识】
    【poe设备加电配置】
  • 原文地址:https://www.cnblogs.com/lxm940130740/p/3565456.html
Copyright © 2020-2023  润新知