Dnight

 

统计难题 字典树 HDU1251

Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).

Input

输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串.

注意:本题只有一组测试数据,处理到文件结束.

Output

对于每个提问,给出以该字符串为前缀的单词的数量.

Sample Input

banana
band
bee
absolute
acm

ba
b
band
abc

Sample Output

2
3
1
0
建立一个字典树,每个节点中得n为个数, 每次到这个节点明说这个深度的单词已经出现一次, n++, 统计完之后,则直接查询,可以减少搜索的操作;
#include <cstdio>
#include 
<cstring>
using namespace std;
struct node{
    
int n;
    
int child[26];
}
;
node trie[
500000];

int main(){
    memset(trie, 
0sizeof(trie));
    
char word[15];
    
int n = 1;
    
while(gets(word),word[0]){
        
int p = 0;
        
for (int i = 0; i<strlen(word);i++){
            
if (trie[p].child[word[i]-'a'== 0){
                trie[p].child[word[i]
-'a'= n++//可以理解为malloc,不过这里已经开辟了一堆素组,是从数组里取
            }

            p 
= trie[p].child[word[i]-'a'];
            trie[p].n
++;
        }

    }

    
while (gets(word)){
        
int p = 0;
        
int flag = 1;
        
for (int i = 0; i < strlen(word); i++){
            
if (trie[p].child[word[i]-'a'== 0)//这里的判断是为了不然p重新为0  而造成回到第一个节点。
                flag = 0;
                
break;
            }

            p 
= trie[p].child[word[i]-'a']; 

        }

        
if (flag == 0){
            printf(
"0\n");
        }

        
else
        printf(
"%d\n", trie[p].n);
    }

    
return 0;
}

 

posted on 2012-07-19 13:27 Dnight 阅读(80) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航:   博客园   博客园最新博文   博问   管理


导航

统计

常用链接

留言簿

文章档案

搜索

最新评论