HDU-1251 统计难题

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 <cstdio>
#include <cstring>
using namespace std;

typedef struct node{
    int num;
    node *next[26];
}Trie;

Trie *init(Trie *rt){
    rt -> num = 0;
    for(int i = 0; i < 26; ++i) rt -> next[i] = NULL;
    return rt;
}
Trie *createTrie(Trie *rt, char *s){
    Trie *p = rt;
    int v, len = strlen(s);
    for(int i = 0; i < len; ++i){
        v = s[i] - 'a';
        if(p -> next[v] == NULL){
            p -> next[v] = new Trie;
            p = p -> next[v];
            p = init(p);
            p -> num = 1;
        }else{
            p = p -> next[v];
            p -> num += 1;
        }
    }
    return rt;
}
int getNum(Trie *rt, char *s){
    Trie *p = rt;
    int v, len = strlen(s);
    for(int i = 0; i < len; ++i){
        v = s[i] - 'a';
        if(p -> next[v] == NULL) return 0;
        else p = p -> next[v];
    }
    return p -> num;
}
void clearTrie(Trie *t){
    if(t == NULL) return;
    for(int i = 0; i < 26; ++i){
        clearTrie(t -> next[i]);
    }
    delete t;
}
int main(){
    Trie *t; t = new Trie; t = init(t);
    char str[12] = {0};
    while(gets(str) != NULL){
        int len = strlen(str);
        if(len == 0) break;
        t = createTrie(t, str);
    }
    while(gets(str) != NULL){
        printf("%d
", getNum(t, str));
    }
    clearTrie(t);
    return 0;
}


原文地址:https://www.cnblogs.com/wiklvrain/p/8179415.html