• HDU 1251统计难题


    统计难题

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

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

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

    trie树的节点

    struct trie_node
    {
    int count;        //统计前缀的数目
    trie_node * next[26];  //二十六个子节点
    bool exict;        //是否为单词的结尾
    }*root;

    说到底trie树就是一颗26叉树,孩子有顺序,分别表示‘a'到’z'。

    根节点不表示字符,也就是说字符是从根节点的孩子开始表示的。

    每插入一个单词就判断下一个字母是否已经建立节点,建立了则进入,没有就插入节点。插入完整个单词后,更改exict为1;

    查找时,从根节点开始判断下一个字母对应的节点是否存在,存在进入,否则判断有该前缀的单词个数为0。查找完整个前缀后,返回后缀最后一个字母对应的count值。

    ——————————————————————————————————————————————————————
     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstring>
     4 #include<algorithm>
     5 
     6 using namespace std;
     7 struct trie_node
     8 {
     9     int count;
    10     trie_node * next[26];
    11     bool exict;
    12 }*root;
    13 trie_node * create_tn()
    14 {
    15     trie_node * tp=new(trie_node);
    16     tp->count=0;
    17     memset(tp->next,0,sizeof(tp->next));
    18     tp->exict=0;
    19     return tp;
    20 }
    21 void insert(char *word)
    22 {
    23     trie_node * p=root;
    24     char *q=word;
    25     while(*q)
    26     {
    27         int id=*q-'a';
    28         if(p->next[id]==NULL)
    29             p->next[id]=create_tn();
    30         p=p->next[id];
    31         ++q;
    32         p->count++;
    33     }
    34     p->exict=1;
    35 }
    36 int search(char *word)
    37 {
    38     trie_node *p=root;
    39     char *q=word;
    40     while(*q)
    41     {
    42         int id=*q-'a';
    43         p=p->next[id];
    44         q++;
    45         if(p==NULL)return 0;
    46     }
    47     return p->count;
    48 }
    49 int main()
    50 {
    51     root=create_tn();
    52     char s[12];
    53     bool bz=0;
    54     while(gets(s))
    55     {
    56         if(bz)printf("%d
    ",search(s));
    57         else 
    58         {
    59             if(strlen(s)!=0)
    60                 insert(s);
    61             else bz=1;
    62         }
    63     }
    64     return 0;
    65 }
    View Code
  • 相关阅读:
    freeswitch对媒体的处理的三种方式
    Windows如何在cmd命令行中查看、修改、删除与添加、设置环境变量
    freeswitch电话代接
    freeswitch三方通话配置
    认识拨号计划
    洛谷P4049 [JSOI2007]合金 题解
    2020-9杂题选做
    LOJ#6497. 「雅礼集训 2018 Day1」图 题解
    LOJ#6496. 「雅礼集训 2018 Day1」仙人掌 题解
    LOJ#6495. 「雅礼集训 2018 Day1」树 题解
  • 原文地址:https://www.cnblogs.com/gryzy/p/6255440.html
Copyright © 2020-2023  润新知