统计难题

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


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
 
 
 
 
普通的字典树的题目
直接用模板就可以了。
/************

HDU 1251 统计难题
字典树模板 

**************/


#include<stdio.h>
#define MAX 26
typedef struct TrieNode
{
    int nCount;
    struct TrieNode *next[MAX];
}TrieNode;

TrieNode Memory[1000000];
int allocp=0;

void InitTrieRoot(TrieNode **pRoot)
{
    *pRoot=NULL;
}        

TrieNode *CreateTrieNode()
{
    int i;
    TrieNode *p;
    
    p=&Memory[allocp++];
    p->nCount=1;
    for(i=1;i<MAX;i++)
    {
        p->next[i]=NULL;
    }    
    return p;
}    

void InsertTrie(TrieNode **pRoot,char *s)
{
    int i,k;
    TrieNode *p;
    
    if(!(p=*pRoot))
      p=*pRoot=CreateTrieNode();
    i=0;
    while(s[i])
    {
        k=s[i++]-'a';
        if(p->next[k]) p->next[k]->nCount++;
        else p->next[k]=CreateTrieNode();
        p=p->next[k];
    }    
}    
int SearchTrie(TrieNode **pRoot,char *s)
{
    TrieNode *p;
    int i,k;
    if(!(p=*pRoot))
      return 0;
    i=0;
    while(s[i])
    {
        k=s[i++]-'a';
        if(p->next[k]==NULL) return 0;
        p=p->next[k];
    }    
    return p->nCount;
}    
int main()
{
    char str[11];
    TrieNode *Root=NULL;
    InitTrieRoot(&Root);
    while(gets(str)&&str[0])
    {
        InsertTrie(&Root,str);
    }    
    while(gets(str))
    {
        printf("%d\n",SearchTrie(&Root,str));
    }    
    return 0;
}    

 

 

再新加一个代码,是动态分配的

看起来也比较容易理解:

#include<stdio.h>
#include<string.h>
struct Node
{
    struct Node *br[26];
    int num;
};
Node *head;
void Tree_insert(char str[])//插入单词 
{
    Node *t,*s=head;
    int i,j;
    int len=strlen(str);
    for(i=0;i<len;i++)
    {
        int id=str[i]-'a';
        if(s->br[id]==NULL)
        {
            t=new Node;
            for(j=0;j<26;j++)
            {
                t->br[j]=NULL;
            }    
            t->num=0;
            s->br[id]=t;
        }    
        s=s->br[id];
        s->num++;
    }    
}    
int Tree_Find(char str[])
{
    Node *s=head;
    int count,i;
    int len=strlen(str);
    for(i=0;i<len;i++)
    {
        int id=str[i]-'a';
        if(s->br[id]==NULL)
        {
            return 0;
        }    
        else
        {
            s=s->br[id];
            count=s->num;
        }    
    }    
    return count;
}    
int main()
{
    int i;
    head=new Node;
    for(i=0;i<26;i++)
    {
        head->br[i]=NULL;
        head->num=0;
    }    
    char str[12];
    while(gets(str)&&str[0])  Tree_insert(str);
    while(gets(str))  printf("%d\n",Tree_Find(str));
    return 0;
}