美文网首页
HDU 1251 统计难题(字典树模板题)

HDU 1251 统计难题(字典树模板题)

作者: 陌路晨曦 | 来源:发表于2017-07-19 13:32 被阅读0次

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

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

    ba
    b
    band
    abc
    Sample Output
    2
    3
    1
    0

    #include <stdio.h>
    #include<stdlib.h>
    #include<math.h>
    #include<algorithm>
    #include<string.h>
    #include<iostream>
    using namespace std;
    
    struct Trie
    {
        int cnt;
        Trie * next[26]; 
    };
    Trie Merrory[1000000];
    int ant;
    
    Trie * Create()
    {
        Trie *rt;
        rt = &Merrory[ant++];
        rt->cnt = 1;
        for(int i=0;i<26;i++)
        {
            rt->next[i] = NULL;
        }
        return rt;
    }
    
    void Insert(char *s, Trie *&Prt)
    {
        Trie *p;
        if(!(p=Prt)) p = Prt = Create();
        
        int i =0 ,k;
        while(s[i])
        {
            k = s[i++] - 'a';
            if(p->next[k]) p->next[k]->cnt++;
            else  p->next[k] = Create();
            p = p->next[k];
         } 
    }
    int Search(char *s, Trie *rt)
    {
        if(!rt) return 0;
        Trie *tmp = rt;
        int i=0,k;
        while(s[i])
        {
            int k = s[i] - 'a';
            if(tmp->next[k]) tmp = tmp->next[k];
            else return 0;
            i++;
        }
        return tmp->cnt;
    }
    int main()
    {
        char s[100];
        Trie * rt = Create();
        while(gets(s) && s[0]!='\0')
        {
            Insert(s,rt);
        }
        while(gets(s))
        {
            int res = Search(s,rt);
            printf("%d\n",res);
        }
    }
    

    相关文章

      网友评论

          本文标题:HDU 1251 统计难题(字典树模板题)

          本文链接:https://www.haomeiwen.com/subject/fyhckxtx.html