hdu1251 统计难题 【字典树】

统计难题

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

Problem Description

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

 

Input

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

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

 

Output

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

 

Sample Input


banana
band
bee
absolute
acm

ba
b
band
abc

 

Sample Output


2
3
1
0

 解题思路:字典树模板题

想学习AC自动机,但是AC自动机的前提是了解字典树,因此想解决字典树,本题算是字典树模板题

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char str[11];
struct node{
    node *next[26];
    int cnt;//表示一个字典树到此有多少相同前缀的数目
    node(){//构造函数,创建结点时自动执行
        cnt=0;
        for(int i=0;i<26;i++)
            next[i]=NULL;//将该节点的下面的26个节点初始化为空
    }
};
void insert(node *p,char *str){
    for(int i=0;str[i];i++){
        int t=str[i]-'a';
        if(p->next[t]==NULL)
            p->next[t]=new node;//如果节点不存在,那么先new一个
        p=p->next[t];//指针指向子孩子
        p->cnt++;//计数器累加
    }
}
int find(node *p,char *str){
    for(int i=0;str[i];i++){
        int t=str[i]-'a';
        p=p->next[t];//指针指向子孩子
        if(!p)//p为空就跳出
            return 0;
    }
    return p->cnt;
}
int main(){
    node *root=new node();
    while(gets(str)&&strlen(str))
        insert(root,str);
    while(gets(str)){
        int ans=find(root,str);
        printf("%d\n",ans);
    }
    return 0;
}
时间: 2024-10-22 06:48:33

hdu1251 统计难题 【字典树】的相关文章

算法题:HDU 1251 统计难题(字典树,统计前缀个数)

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

HDOJ/HDU 1251 统计难题(字典树啥的~Map水过)

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

字典树概述

字典树简介 字典树(Trie Tree),又称单词查找树,是键树的一种,典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计. 字典树有3个基本性质: 1.根节点不包含字符,其余的每个节点都包含一个字符: 2.从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串: 3.每个节点的所有子节点包含的字符都不相同. 字典树的结构一般如下图所示: 以字符串为例,我们可以将其存储结构写成如下形式: #define MAX 26 //字符集的大

算法题:HDU 3724 Encoded Barcodes(字典树,计算前缀数)

链接: http://acm.hdu.edu.cn/showproblem.php?pid=3724 题目: Encoded Barcodes Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1022    Accepted Submission (s): 337 Problem Description All the big mall

从Trie树(字典树)谈到后缀树(10.28修订)

作者:July.yansha. 出处:http://blog.csdn.net/v_JULY_v .  引言     常关注本blog的读者朋友想必看过此篇文章:从B树.B+树.B*树谈到R 树,这次,咱们来讲另外两种树:Tire树与后缀树.不过,在此之前,先来看两个问题.     第一个问题: 一个文本文件,大约有一万行,每行一个词,要求统计出其中最频繁出现的前10个词,请给出思想,给出时间复杂度分析.     之前在此文:海量数据处理面试题集锦与Bit-map详解中给出的参考答案:用trie

字典树(Trie tree)

Trie,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高. 性质 它有3个基本性质: 根节点不包含字符,除根节点外每一个节点都只包含一个字符. 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串. 每个节点的所有子节点包含的字符都不相同. [编辑]图示 这是一个Trie结构的例子:  在这个Trie结构中,保存

[算法系列之二十]字典树(Trie)

一 概述 又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计. 二 优点 利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希表高. 三 性质 (1)根节点不包含字符,除根节点外每一个节点都只包含一个字符: (2)从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串: (3)每个节点的所有子节点包含的字符都不相同. 单词列表为"apps&

字典树(Trie Tree)

基本概念和性质 在计算机科学中,trie,又称前缀树或字典树或单词搜索树,是一种有序树,用于保存关联数组,其中的键通常是字符串.与二叉查找树不同,键不是直 接保存在节点中,而是由节点在树中的位置决定.一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串.一般情况下,不是 所有的节点都有对应的值,只有叶子节点和部分内部节点所对应的键才有相关的值. 本文地址:http://www.cnblogs.com/archimedes/p/trie-tree.html,转载请注明

字典树(Trie树)的实现及应用

一.字典树的概念 Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树. 与二叉查找树不同,Trie树的键不是直接保存在节点中,而是由节点在树中的位置决定.一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串.一般情况下,不是所有的节点都有对应的值,只有叶子节点和部分内部节点所对应的键才有相关的值. Trie树优点是最大限度地减少无谓的字符串比较,查询效率比较高.核心思想是空间换时