HDU 1251统计难题

统计难题

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

Problem Description
Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).
 
Input
输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串.

注意:本题只有一组测试数据,处理到文件结束.
 
Output
对于每个提问,给出以该字符串为前缀的单词的数量.
 
Sample Input
banana band bee absolute acm ba b band abc
 
Sample Output
2 3 1 0
 
——————————————————————————————————————————————————————
本题为字符串统计处理题,用到trie树。

trie树的节点

struct trie_node
{
int count;        //统计前缀的数目
trie_node * next[26];  //二十六个子节点
bool exict;        //是否为单词的结尾
}*root;

说到底trie树就是一颗26叉树,孩子有顺序,分别表示‘a'到’z'。

根节点不表示字符,也就是说字符是从根节点的孩子开始表示的。

每插入一个单词就判断下一个字母是否已经建立节点,建立了则进入,没有就插入节点。插入完整个单词后,更改exict为1;

查找时,从根节点开始判断下一个字母对应的节点是否存在,存在进入,否则判断有该前缀的单词个数为0。查找完整个前缀后,返回后缀最后一个字母对应的count值。

——————————————————————————————————————————————————————
 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<algorithm>
 5 
 6 using namespace std;
 7 struct trie_node
 8 {
 9     int count;
10     trie_node * next[26];
11     bool exict;
12 }*root;
13 trie_node * create_tn()
14 {
15     trie_node * tp=new(trie_node);
16     tp->count=0;
17     memset(tp->next,0,sizeof(tp->next));
18     tp->exict=0;
19     return tp;
20 }
21 void insert(char *word)
22 {
23     trie_node * p=root;
24     char *q=word;
25     while(*q)
26     {
27         int id=*q-'a';
28         if(p->next[id]==NULL)
29             p->next[id]=create_tn();
30         p=p->next[id];
31         ++q;
32         p->count++;
33     }
34     p->exict=1;
35 }
36 int search(char *word)
37 {
38     trie_node *p=root;
39     char *q=word;
40     while(*q)
41     {
42         int id=*q-'a';
43         p=p->next[id];
44         q++;
45         if(p==NULL)return 0;
46     }
47     return p->count;
48 }
49 int main()
50 {
51     root=create_tn();
52     char s[12];
53     bool bz=0;
54     while(gets(s))
55     {
56         if(bz)printf("%d\n",search(s));
57         else 
58         {
59             if(strlen(s)!=0)
60                 insert(s);
61             else bz=1;
62         }
63     }
64     return 0;
65 }
View Code

 

posted on 2017-01-06 10:57  gryzy  阅读(176)  评论(0编辑  收藏  举报

导航