• HDU 1251(trie树)


    统计难题

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


    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 <stdio.h>   
    #include <string.h> 
    #include <malloc.h>
    #include <stdlib.h>  
    const int N = 26;   
    typedef struct Node    
    {   
        int cnt;   
        Node *child[26];    
    }Node; 
    Node *root;    
    void init()
    {//对根节点初始化,根节点不存储任何数据
        root =(Node *)malloc(sizeof(Node)); 
        for(int i = 0; i < N; i++)
            root->child[i] = NULL;
        root->cnt = 0; 
    } 
    void insert(char *str)
    {
        Node *current, *newnode;   
        int i, j,index;
        int len = strlen(str);    
        if(len == 0)
            return;//无须插入的情况
        current = root;
        for(i = 0; i < len; i++)
        {
            index = str[i]-'a';
            if(current->child[index]!=NULL)
            {//子树存在
                current = current->child[index];
                current->cnt++; 
            } 
            else
            {//子树不存在的情况 
                newnode =(Node *)malloc(sizeof(Node)); 
                for(j = 0; j < N; j++)
                    newnode->child[j] = NULL;
                newnode->cnt = 1;            
                current->child[index] = newnode;//这一句不可少 
                current = newnode; //current = current->child[index]
            }
        }
    }
    int search( char *str )   
    { 
        int i, j, k, index;  
        Node *current, *newnode;    
        current = root;   
        for(i=0;str[i]!= '\0';++i )   
        {   
            index=str[i]-'a';   
            if(current->child[index]==NULL)   
                return 0;   
            current=current->child[index];   
        }         
        return current->cnt;   
    }                  
    int main()   
    {   
        char str[15]; 
        init();  
        while(gets(str),strcmp(str, ""))   
            insert( str );   
        while(gets(str)!=NULL)   
            printf( "%d\n", search(str));   
        return 0;   
    }  
    
    
    
    
    
    //还没找到错误 
    #include <stdio.h>   
    #include <string.h> 
    #include <malloc.h>
    #include <stdlib.h>     
    typedef struct Node    
    {   
        int cnt;   
        Node *childs[26];   
        Node() //不可再加上struct 
        { 
            cnt = 0; 
            memset(childs,NULL,sizeof(childs)); 
        }   
    }Node;    
    Node *current, *newnode;  
    Node *root =(Node *)malloc(sizeof(Node));       
    void insert(char *str)   
    {   
        int i, j, k, index; 
        current=root;   
        for(i=0;str[i]!='\0';++i)   
        {   
            index = str[i]-'a';   
            if( current->childs[index]!= NULL )   
            {   
                current = current->childs[index];   
                ++(current->cnt);   
            }   
            else    
            {   
                newnode = (Node *)malloc(sizeof(Node));
                if(newnode==NULL)
                    exit(-1);               
                newnode->cnt++;//等价于 newnode->cnt=1
                current->childs[index] = newnode;   
                current = current->childs[index];   
            }   
        }   
    }     
    int search( char *str )   
    { 
        int i, j, k, index;   
        current = root;   
        for(i=0;str[i]!= '\0';++i )   
        {   
            index=str[i]-'a';   
            if(current->childs[index]==NULL)   
                return 0;   
            current=current->childs[index];   
        }   
           
        return current->cnt;   
    }                  
    int main()   
    {   
        char str[15];   
        while(gets(str),strcmp(str, ""))   
            insert( str );   
        while(gets(str)!=NULL)   
            printf( "%d\n", search(str));   
        return 0;   
    }  
    /*
    单步调试过程中,程序产生一个访问异常(段违例) 
    */
    
  • 相关阅读:
    SQL语句中exists/not exists的用法分析
    码元、符号、波特率、比特率等概念的了解
    LED学习及一个花样流水灯的实现
    数学建模总结
    单片机控制继电器
    透明传输
    DNN4.8+SQL 2005 EXPRESS安装及DNN 4.8版本的新特性与其他版本的差异
    为什么我被google 迷住了!还很激动!Google是什么?它为何有趣
    四角号码查询器 第3版 发布
    google base不只是ebay!令人激动的google base
  • 原文地址:https://www.cnblogs.com/hxsyl/p/2617967.html
Copyright © 2020-2023  润新知