hdu-1251 字典树公共前缀。

来源:互联网 发布:手机淘宝秒杀怎么刷新 编辑:程序博客网 时间:2024/06/04 18:21
Problem Description
Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).
 

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

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

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

Sample Input
bananabandbeeabsoluteacmbabbandabc
 

Sample Output
2310
 
题意整理:
先输入一连串单词,再输入某个前缀,输出含有该前缀的单词的数目。

解题思路:
这是一道典型的字典树题,在套用字典树的模版的同时,加入一个统计经过该结点的单词的数目的变量。只要输出这个值即可。

关于字典树的一些东西:
typedef struct node{
node *next[26];   // 表示这个节点后面的字母有没有取到,0到25分别表示a到z
bool isword; // 判断这个到这个节点为止是否组成单词,本题中并没有用到这个变量
int sub; // 求字典树公共前缀数目时要用到,记录经过这个节点的单词的数目,即字树的数量
node(){
sub = 0;
for(int i = 0; i < 26; i ++)
next[i] = NULL;
} // 节点的默认构造函数
};

至于算法,可以参考这个链接:http://blog.csdn.net/topcoder1234/article/details/5887653
和百度百科:http://baike.baidu.com/view/2759664.htm?fr=aladdin


字典树图片示例:


AC代码:

#include <iostream>#include <stdio.h>using namespace std;typedef struct node{    node *next[26];    bool isword;    int sub;    node(){        isword = false;        sub = 0;        for(int i = 0; i < 26; i ++)            next[i] = NULL;    }};class Trie{public:    node *root;    Trie(){        root = NULL;    }    void insert(char str[])    {        if(!root)            root = new node;        node *location = root;        for(int i = 0; i < strlen(str); i ++)        {            int num = str[i] - 'a';            if(location->next[num] == NULL)                location->next[num] = new node;            location->next[num]->sub ++;            location = location->next[num];        }        location->isword = true;            }    int search(char str[])    {        node *location = root;        int num;        for(int i = 0; i < strlen(str); i ++)        {            num = str[i] - 'a';            if(location->next[num] == NULL)                return 0;            location = location->next[num];        }        return location->sub;    }};int main(){    Trie tree;    char str[15];    while(gets(str) && strlen(str))    {        tree.insert(str);    }    while(gets(str))    {        int count = tree.search(str);        cout << count << endl;    }    return 0;}

当前水平难度评价: 4
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小学生做题容易马虎出错怎么办 小学生做题老是马虎怎么办 小学生做题马虎不认真怎么办 会做的题总做错怎么办 孩子数学做题粗心怎么办 孩子成绩考差了怎么办 孩子静不下心学习怎么办 孩子考试时总是粗心马虎怎么办 小学二年级学生厌学怎么办 三岁宝宝肚脐痛怎么办 做题速度太慢怎么办 孩子做题不动脑不会转弯怎么办? 孩子做题总是马虎怎么办 孩子做题总是眼高手低怎么办 小孩说幼儿园老师不喜欢他怎么办 初中学生了不喜欢读书怎么办 小孩吐怎么办给揉哪里 8岁了不爱写字怎么办呢 8岁了不会写字怎么办呢 高考做题时犯各种粗心错误怎么办 孩子做题不认真读题怎么办 孩子不爱学习怎么办有什么办法 小孩字写的不好怎么办 孩子的字写得丑怎么办 一年级孩子生字默不出来怎么办 5岁宝宝不爱写字怎么办 三年级小孩不自觉做作业怎么办 一年级的孩子不爱写字怎么办 一年级孩子不爱写作业怎么办 一年级的小孩不爱写字怎么办 小孩儿写字做作业磨蹭怎么办 孩子不学习成绩差不写作业怎么办 儿童4岁不会写字怎么办 小孩读中班还不会写字怎么办 幼儿园中班孩子不写字怎么办 小孩吃多了呕吐怎么办 一岁宝宝老便秘怎么办 4周岁半幼儿便秘怎么办 没胃口不能吃辣怎么办 九个月宝宝缺锌怎么办 宝宝4 5天不吃饭怎么办