HDU 1251 统计难题(trie树入门)

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





解题分析:

这里的意义就是查找前缀

可以用字典树来写,TrieTree

这里还需要处理的就是对于输入的问题:

while(scanf("%s", str) && str[0])

{


}



代码:

#include <iostream>
#include <cstdio>
using namespace std;
struct node {
    int w;
    int child[26];
} trie[1000010];


int size = 0;


void Insert(char* word, int i, int rt)
{
    if (!word[i])
        return ;


    int m = word[i] - 'a';
    if (trie[rt].child[m])
    {
        trie[trie[rt].child[m]].w += 1;
        Insert(word, i + 1, trie[rt].child[m]);
    }
    else
    {
        trie[rt].child[m] = ++size;
        trie[trie[rt].child[m]].w += 1;
        Insert(word, i + 1, size);
    }
}


int Query(char* word, int i, int rt)
{
    if (!word[i])
        return trie[rt].w;


    int m = word[i] - 'a';
    if (trie[rt].child[m])
        return Query(word, i + 1, trie[rt].child[m]);
    else
        return 0;
}


int main()
{
    char word[12];
    while (gets(word) && word[0])
        Insert(word, 0, 0);


    while (gets(word))
        printf("%d\n", Query(word, 0, 0));


    return 0;
}


你可能感兴趣的:(HDU 1251 统计难题(trie树入门))