zoukankan      html  css  js  c++  java
  • 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;
    }
    

      

  • 相关阅读:
    静态链接与动态链接的区别(转载)
    VC++界面编程之--阴影窗口的实现详解
    win7 vmware 无法使用usb
    如何划分子网,确定子网和掩码的位数?
    华为三层交换机-路由-硬件防火墙的配置
    jquery json ajax -2
    jquery json ajax
    wes开发笔记
    伪类和伪元素
    优化sql语句
  • 原文地址:https://www.cnblogs.com/wikioibai/p/4783318.html
Copyright © 2011-2022 走看看