HDU - 1251 统计难题 (字典树)

原创 2018年04月17日 20:50:45

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

注意:本题只有一组测试数据,处理到文件结束. 
Output对于每个提问,给出以该字符串为前缀的单词的数量. 
Sample Input
banana
band
bee
absolute
acm

ba
b
band
abc
Sample Output
2
3
1
0

#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<string.h>
#define ll long long
#define mod 1000000007
using namespace std;
int node; //节点,节点0为根节点
int nex[1000005][26]; 
int v[1000005];//该节点出现过几次
void build(char *str) //建树
{
    int len=strlen(str);
    int cur=0,k; //cur为从哪个节点连结到枚举的字母
    for(int i=0;i<len;i++)//每个字母
    {
        k=str[i]-'a';
        if(nex[cur][k]==0) //如果没有该节点
        {
            memset(nex[node],0,sizeof(nex[node])); //node即为该节点,先清空
            v[node]=0;//先记为0
            nex[cur][k]=node++;//对于cur节点的第k个节点指向node
        }
        v[nex[cur][k]]++;//对于节点次数++
        cur=nex[cur][k];//cur改为上一个指向的节点
    }
}
int querry(char *str) //查询
{
    int k,cur=0;
    int len=strlen(str);
    for(int i=0;i<len;i++)
    {
        k=str[i]-'a';
        if(nex[cur][k])//如果存在节点
            cur=nex[cur][k];//cur变为这个节点
        else
            return 0; //不存在该节点
    }
    return v[cur];//输出次数
}
int main()
{
   node=1;
   memset(nex[0],0,sizeof(nex[0]));
    char str[30];
    while(gets(str)&&str[0])
    {
        build(str);
    }
    while(gets(str))
    {
        printf("%d\n",querry(str));
    }
    return 0;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dsaghjkye/article/details/79980306

HDU-1251 统计难题,字典树或者map!

统计难题      很久就看过这个题了,但不会~~~不会~~      题意:给出一张单词表,然后下面有若干查询,每次给出一个单词,问单词表中是否存在以这个单词为前缀的单词,输出数量。本身也是自身的...
  • NYIST_TC_LYQ
  • NYIST_TC_LYQ
  • 2017-01-12 17:07:57
  • 259

HDU-1251-统计难题

HDU-1251-统计难题 http://acm.hdu.edu.cn/showproblem.php?pid=1251 基本的字典树,字典树又称单词查找树,Trie树,是一种树形结构,是一种哈希...
  • Cambridgeacm
  • Cambridgeacm
  • 2012-07-16 16:55:13
  • 4974

hdu 1251 统计难题 (map水过)

# include # include # include # include # include using namespace std; int main() { char a;...
  • lp_opai
  • lp_opai
  • 2014-08-15 21:59:31
  • 724

Hdu-1251 统计难题

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1251 解题思路: 字典树的典型应用——插入,查询。 1.插入时候,不是字母结束时将head->c...
  • niushuai666
  • niushuai666
  • 2011-09-20 18:28:56
  • 1635

【字典树模板(数组实现)】HDU 1251 统计难题

#include #include #define NODE 1000005 int next[NODE][26]; int v[NODE]; int node; void init(){ ...
  • u011695464
  • u011695464
  • 2014-06-19 14:16:02
  • 630

HUD Problem - 1251 统计难题

解题感悟: 提交时注意语言选择,这道题用G++提交 ,会爆内存(Memory Limit Exceeded),用c++提交可以AC ....
  • chen_swe
  • chen_swe
  • 2015-08-09 14:20:59
  • 258

hdu 1251 统计难题 (Map的使用)

对于map的一点了解 :首先,会在map查找这个键值的项,map如果不包含某个键值,会返回map的end,然后它发现此键值没有找到(_Where == this->end())的话,会自动在末尾插入...
  • ldw201510803006
  • ldw201510803006
  • 2017-01-14 23:50:56
  • 118

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

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

HDOJ 1251-统计难题【模板:字典树】

统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others) Total Su...
  • qq_29600137
  • qq_29600137
  • 2016-05-14 16:42:57
  • 536

HDU - 1251 - 统计难题(字典树)

HDU 1251.统计难题(字典树) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java...
  • violet_echo_0908
  • violet_echo_0908
  • 2015-08-07 13:18:45
  • 544
收藏助手
不良信息举报
您举报文章:HDU - 1251 统计难题 (字典树)
举报原因:
原因补充:

(最多只允许输入30个字)