zoukankan      html  css  js  c++  java
  • HDU 1251 统计难题(字典树入门模板题 很重要)

    统计难题

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


    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   |   We have carefully selected several similar problems for you:  1075 1247 1671 1298 1800 
     
    入门模板
    理解就好
    code:
    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<stdio.h>
    #include<string.h>
    #include<malloc.h>
    using namespace std;
    struct Trie
    {
        int v;//v可以根据实际情况任意变化,在这里v是每个字母的次数;
        Trie *next[26];
    };
    Trie root;
    void createTrie(char *str)//建立字典树;
    {
        int len=strlen(str);
        Trie *p=&root,*q;
        for(int i=0;i<len;i++)
        {
            int id=str[i]-'a';
            if(p->next[id]==NULL)
            {
                q=(Trie *)malloc(sizeof(root));//申请一块新内存;
                q->v=1;//v遇到新字母每一层都初始化为1;
    
                for(int j=0;j<26;j++)
                q->next[j]=NULL;//孩子结点初始化
    
                p->next[id]=q;
                p=p->next[id];//往下走
            }
            else
            {
                p->next[id]->v++;//当第一个输入的字符串和后面又相等的时候,v++;
                p=p->next[id];
            }
        }
    }
    
    int findTrie(char *str)//在字典树里查询;
    {
        int len=strlen(str);
        Trie *p=&root;
        for(int i=0;i<len;i++)
        {
            int id=str[i]-'a';
            p=p->next[id];
            if(p==NULL)
            return 0;
        }
        return p->v;//相同的字母个数;
    }
    int main()
    {
        char str[15];
        for(int i=0;i<26;i++)
        root.next[i]=NULL;
        while(gets(str)&&str[0]!='')
        {
            createTrie(str);
        }
        while(cin>>str)
        {
            int ans=findTrie(str);
            cout<<ans<<endl;
        }
        return 0;
    }
     
  • 相关阅读:
    进制
    流程控制
    运算符
    格式化输出
    数据结构-树的遍历
    A1004 Counting Leaves (30分)
    A1106 Lowest Price in Supply Chain (25分)
    A1094 The Largest Generation (25分)
    A1090 Highest Price in Supply Chain (25分)
    A1079 Total Sales of Supply Chain (25分)
  • 原文地址:https://www.cnblogs.com/yinbiao/p/9489918.html
Copyright © 2011-2022 走看看