zoukankan      html  css  js  c++  java
  • HDU 1251统计难题

    统计难题

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

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

    注意:本题只有一组测试数据,处理到文件结束.
     
    Output
    对于每个提问,给出以该字符串为前缀的单词的数量.
     
    Sample Input
    banana band bee absolute acm ba b band abc
     
    Sample Output
    2 3 1 0
     
    ——————————————————————————————————————————————————————
    本题为字符串统计处理题,用到trie树。

    trie树的节点

    struct trie_node
    {
    int count;        //统计前缀的数目
    trie_node * next[26];  //二十六个子节点
    bool exict;        //是否为单词的结尾
    }*root;

    说到底trie树就是一颗26叉树,孩子有顺序,分别表示‘a'到’z'。

    根节点不表示字符,也就是说字符是从根节点的孩子开始表示的。

    每插入一个单词就判断下一个字母是否已经建立节点,建立了则进入,没有就插入节点。插入完整个单词后,更改exict为1;

    查找时,从根节点开始判断下一个字母对应的节点是否存在,存在进入,否则判断有该前缀的单词个数为0。查找完整个前缀后,返回后缀最后一个字母对应的count值。

    ——————————————————————————————————————————————————————
     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstring>
     4 #include<algorithm>
     5 
     6 using namespace std;
     7 struct trie_node
     8 {
     9     int count;
    10     trie_node * next[26];
    11     bool exict;
    12 }*root;
    13 trie_node * create_tn()
    14 {
    15     trie_node * tp=new(trie_node);
    16     tp->count=0;
    17     memset(tp->next,0,sizeof(tp->next));
    18     tp->exict=0;
    19     return tp;
    20 }
    21 void insert(char *word)
    22 {
    23     trie_node * p=root;
    24     char *q=word;
    25     while(*q)
    26     {
    27         int id=*q-'a';
    28         if(p->next[id]==NULL)
    29             p->next[id]=create_tn();
    30         p=p->next[id];
    31         ++q;
    32         p->count++;
    33     }
    34     p->exict=1;
    35 }
    36 int search(char *word)
    37 {
    38     trie_node *p=root;
    39     char *q=word;
    40     while(*q)
    41     {
    42         int id=*q-'a';
    43         p=p->next[id];
    44         q++;
    45         if(p==NULL)return 0;
    46     }
    47     return p->count;
    48 }
    49 int main()
    50 {
    51     root=create_tn();
    52     char s[12];
    53     bool bz=0;
    54     while(gets(s))
    55     {
    56         if(bz)printf("%d
    ",search(s));
    57         else 
    58         {
    59             if(strlen(s)!=0)
    60                 insert(s);
    61             else bz=1;
    62         }
    63     }
    64     return 0;
    65 }
    View Code
  • 相关阅读:
    win7 64位系统,vs2010下配置OpenGL开发环境
    OpenCV stereo matching 代码 matlab实现视差显示
    Cocos2d-x 3.x游戏开发之旅
    芯片验证漫游指南
    名师讲坛:PHP开发实战权威指南
    Python带我起飞:入门、进阶、商业实战
    新编Excel会计与财务管理应用大全(2016实战精华版)
    CorelDRAW X7中文版完全自学宝典
    HTML5 canvas开发详解(第2版)
    中文版3ds Max 2014--VRay效果图制作实用教程
  • 原文地址:https://www.cnblogs.com/gryzy/p/6255440.html
Copyright © 2011-2022 走看看