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

链接:

http://acm.hdu.edu.cn/showproblem.php?pid=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<iostream>
#include<cstdio>
#include<cstring>
using namespace std;  

const int KIND = 26;
const int MAXN = 150000;
int cntNode;  

struct node{
    bool isword;
    int prefix;
    node *next[KIND];
    void init(){
        isword=0;
        prefix=0;
        memset(next, 0, sizeof(next));
    }
}HEAP[MAXN];  

inline node* newNode(){
    HEAP[cntNode].init();
    return &HEAP[cntNode++];
}  

void insert(node* root, char *str){
    for(char *p=str; *p; ++p){
        int ch=*p-'a';
        if(root->next[ch]==NULL){
            root->next[ch] = newNode();
        }
        root = root->next[ch];
        root->prefix++;
    }
    root->isword=true;
}  

int count(node *root, char *str){ // 返回前缀数量
    int sum=0;
    for(char *p=str; *p; ++p){
        char ch=*p-'a';
        if(root->next[ch]==NULL) return 0;
        root=root->next[ch];
    }
    return root->prefix;
}  

int main(){
    char str[12];
    node *root = newNode();
    while(gets(str)){
        if(str[0]==0)break;
        insert(root, str);
    }
    while(gets(str)){
        printf("%d\n", count(root, str));
    }
    return 0;
}

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/sjjg/

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索int
, 统计单词出现个数
, next
, 难题求解答
, root
, 单词
, 字典树
, 前缀
, str
, pat acm题
, 算法 ccf acm
, acm算法问题c语言hdu
, acm算法数据结构
, acm字符
网络流 acm 算法
统计难题、字典树、可持久化字典树、字典树算法、字典树模板,以便于您获取更多的相关知识。

时间: 2024-08-04 02:23:09

算法题:HDU 1251 统计难题(字典树,统计前缀个数)的相关文章

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

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

Hash树(散列树)和Trie树(字典树、前缀树)

1.Hash树 理想的情况是希望不经过任何比较,一次存取便能得到所查的记录, 那就必须在记的存储位置和它的关键字之间建立一个确定的对应关系f,使每个关键字和一个唯一的存储位置相对应.因而在查找时,只要根据这个对应关系f找到 给定值K的像f(K).由此,不需要进行比较便可直接取得所查记录.在此,我们称这个对应关系为哈希(Hash)函数,按这个思想建立的表为哈希表. 在哈希表中对于不同的关键字可能得到同一哈希地址,这种现象称做冲突.在一般情况下,冲突只能尽可能地减少,而不能完全避免.因为哈希函数是从

字典树概述

字典树简介 字典树(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

算法题:HDU 1075 What Are You Talking About(字典树学习题)

链表: http://acm.hdu.edu.cn/showproblem.php?pid=1075 题目: What Are You Talking About Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 102400/204800 K (Java/Others) Total Submission(s): 7939    Accepted Submission(s): 2470 Problem Description Ign

算法题:HDU 2846 Repository(字典树,计数)

链接: http://acm.hdu.edu.cn/showproblem.php?pid=2846 题目: Repository Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 1657    Accepted Submission (s): 605 Problem Description When you go shopping,

算法题:HDU 1247 Hat’s Words(字典树)

链接: http://acm.hdu.edu.cn/showproblem.php?pid=1247 题目大意: 按照字典序给出多个单词,  可以发现里面有些单词是由字典中其它的两个单词组成的.按顺 序输出所有符合这个条件的单词. 分析与总结: 用字典树存下所有的单词,然后对所有单词一一枚举, 对每个单词, 又进行"拆分", 拆分可能有多种情况,所以枚举单词拆分的中点,在字典序中查找拆分后的两部分是否存在,存在即输 出. 代码: #include<iostream> #in

hdu 1251 统计难题

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

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