• HDU 统计难题


    统计难题

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

    Problem Description
    Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).
     
    Input
    输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串.
    注意:本题只有一组测试数据,处理到文件结束.
     
    Output
    对于每个提问,给出以该字符串为前缀的单词的数量.
     
    Sample Input
    banana
    band
    bee
    absolute
    acm
     
    ba
    b
    band
    abc
     
    Sample Output
    2
    3
    1
    0
     
     
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    
    using namespace std;
    
    struct node{
        int cnt;
        node *next[26];
        node(){
            for(int i=0;i<26;i++)
                next[i]=NULL;
        }
    };
    
    node *Root;
    
    void Insert(char *str){
        node *loc=Root,*tmp;
        for(int i=0;str[i]!='\0';i++){
            int id=str[i]-'a';
            if(loc->next[id]!=NULL){
                loc=loc->next[id];
                loc->cnt++;
            }else{
                tmp=new node;
                loc->next[id]=tmp;
                loc=loc->next[id];
                loc->cnt=1;
            }
        }
    }
    
    int SearchTrie(char *str){
        node *loc=Root;
        for(int i=0;str[i]!='\0';i++){
            int id=str[i]-'a';
            if(loc->next[id]!=NULL)
                loc=loc->next[id];
            else
                return 0;
        }
        return loc->cnt;
    }
    
    void release(node *Root){
        if(Root==NULL)
            return ;
        for(int i=0;i<26;i++)
            if(Root->next[i]!=NULL)
                release(Root->next[i]);
        delete Root;
        Root=NULL;
    }
    
    int main(){
    
        //freopen("input.txt","r",stdin);
    
        char a[15];
        Root=new node;
        Root->cnt=0;
        while(gets(a)){
            if(strlen(a)==0)
                break;
            Insert(a);
        }
        while(gets(a)){
            printf("%d\n",SearchTrie(a));
        }
        release(Root);
        return 0;
    }
     
     
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    
    #define N 26
    
    struct Trie{
        int num;
        struct Trie *next[N];
    };
    
    struct Trie *Root;
    
    void Init(){
        Root=(Trie *)malloc(sizeof(Trie));
        Root->num=0;
        for(int i=0;i<N;i++){
            Root->next[i]=NULL;
        }
    }
    
    void InsertTrie(char *str){
        Trie *location=Root,*tmp;
        while(location!=NULL && *str!='\0'){
            int id=*str-'a';
            if(location->next[id]==NULL){
                tmp=(Trie *)malloc(sizeof(Trie));
                for(int i=0;i<N;i++)
                    tmp->next[i]=NULL;
                tmp->num=1;
                location->next[id]=tmp;
            }else
                location->next[id]->num++;
            location=location->next[id];
            str++;
        }
    }
    
    int SearchTrie(char *str){
        Trie *location=Root;
        while(location!=NULL && *str!='\0'){
            int id=*str-'a';
            location=location->next[id];
            str++;
        }
        if(location!=NULL)
            return location->num;
        else
            return 0;
    }
    
    int main(){
        char str[15];
        Init();
        while(gets(str) && str[0]){
            InsertTrie(str);
        }
        while(gets(str)){
            printf("%d\n",SearchTrie(str));
        }
        return 0;
    }
  • 相关阅读:
    iframe 的自适应高度
    在repeater、datalist控件中使用分页功能
    多语言网站开发:不完全技术分析
    提高ASP.Net应用程序性能的十大方法
    使用ASP在线解压rar文件
    在C#程序设计中使用Win32类库
    FCKeditor 2.0 的设置.修改.使用
    Windows Server 2003 四种版本的区别
    在ASP中应用FCKeditor2.1.1
    获得汉字的拼音首字母源代码
  • 原文地址:https://www.cnblogs.com/jackge/p/2824236.html
Copyright © 2020-2023  润新知