• HDU 1251 统计难题(trie简单应用)


    统计难题

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


    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
     

    题目大意:

      给你很多个长度不超过10的单词,组成了一个字典,让后,给你很多个前缀,问你以这个前缀为前缀的单词总共有多少个。

    解题思路:

      简单的trie应用。

    指针版本

    代码:

    # include<cstdio>
    # include<iostream>
    # include<algorithm>
    # include<cstring>
    
    
    using namespace std;
    
    struct trie
    {
        trie * nxt[26];
        int cnt;
    };
    trie * root = new trie;
    
    void insert( char * str )
    {
        trie * p = root;
        trie * newnode;
        for ( int i = 0;str[i];i++ )
        {
            if ( p->nxt[str[i]-'a']==0 )
            {
                newnode = new trie;
                for ( int j = 0;j < 26;j++ )
                {
                    newnode->nxt[j] = NULL;
                }
                newnode->cnt = 1;
                p->nxt[str[i]-'a'] = newnode;
                p = newnode;
            }
            else
            {
                p = p->nxt[str[i]-'a'];
                p->cnt++;
            }
        }
    }
    
    int find ( char * str )
    {
        trie * p = root;
        for ( int i = 0;str[i];i++ )
        {
            if ( p->nxt[str[i]-'a']!=NULL )
            {
                p = p->nxt[str[i]-'a'];
            }
            else
                return 0;
        }
        return p->cnt;
    }
    
    /*void Release(trie *p)
    {
        if (p == NULL)
            return ;
        for (int i = 0;i < 26;i ++)
            if (p->nxt[i] != NULL)
                Release(p->nxt[i]);
        free(p);
        root = NULL;
        return ;
    }*/
    
    
    int main(void)
    {
        char str[15];
        for ( int i = 0;i < 26;i++ )
        {
            root->nxt[i] = NULL;
        }
        root->cnt = 0;
        while ( gets(str) )
        {
            if ( strcmp(str,"")==0 )
                break;
            insert(str);
        }
        while ( scanf("%s",str)!=EOF )
        {
            printf("%d
    ",find(str));
        }
        //Release(root);
    
        return 0;
    }
    

     

    数组版本:

    # include<cstdio>
    # include<cstring>
    # include<iostream>
    
    using namespace std;
    const int root=0;
    int tot;
    struct node
    {
        int cnt;
        int next[26];
        void newnode()
        {
            cnt=0;
            for(int i=0;i<26;i++)
            {
                next[i]=-1;
            }
        }
    }t[1000005];
    
    void clear()
    {
        tot=0;
        t[root].newnode();
    }
    
    void insert(char *str)
    {
        int p=root;
        int len=strlen(str);
        for(int i=0;i<len;i++)
        {
            int id=str[i]-'a';
            if(t[p].next[id]==-1)
            {
                t[++tot].newnode();
                t[p].next[id]=tot;
            }
            p=t[p].next[id];
            t[p].cnt++;
        }
    }
    
    int find(char *str)
    {
        int p=root;
        int len=strlen(str);
        for(int i=0;i<len;i++)
        {
            int id=str[i]-'a';
            if(t[p].next[id]==-1)
            {
                return 0;
            }
            p=t[p].next[id];
        }
        return t[p].cnt;
    }
    
    int main(void)
    {
        char str[15];
        clear();
        while( gets(str) )
        {
            if ( strcmp(str,"")==0 )
                break;
            insert(str);
        }
        while( scanf("%s",str)!=EOF )
        {
            printf("%d
    ",find(str));
        }
        return 0;
    }
    

      

  • 相关阅读:
    groovy main method is use static main(args) //ok
    undefined reference to
    CuTest: C Unit Testing Framework
    screen to tmux: A Humble Quickstart Guide « My Humble Corner
    main,tmain,winmain()等函数——UNICODE sensensen 博客园
    Adding Unit Tests to a C Project NetBeans IDE 6.9 Tutorial
    罗马转数字
    About Luvit
    KISSY Keep It Simple & Stupid, Short & Sweet, Slim & Sexy...
    Create a CSV file
  • 原文地址:https://www.cnblogs.com/wikioibai/p/4783318.html
Copyright © 2020-2023  润新知