• hdu1251字典树递归算法


    统计难题

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

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

    字典树递归算法:

     1 #include <iostream>
     2 #include <stdio.h>
     3 #include <algorithm>
     4 #include <string.h>
     5 #include <math.h>
     6 #include <vector>
     7 #include <stack>
     8 #include <map>
     9 using namespace std;
    10 #define ll long long int
    11 #define INF 5100000
    12 typedef struct node
    13 {
    14     struct node *next[26];
    15     int n;
    16 }trie;
    17 trie *inti()
    18 {
    19     trie *t;
    20     t=(trie *)malloc(sizeof(trie));
    21     t->n=0;
    22     for(int i=0;i<26;i++) t->next[i]=NULL;
    23     return t;
    24 }
    25 void insert(trie *t,char a[])
    26 {
    27     t->n++;
    28     if(*a=='')return ;
    29     if(!t->next[*a-'a'])t->next[*a-'a']=inti();
    30     insert(t->next[*a-'a'],a+1);
    31 }
    32 int query(trie *t,char a[])
    33 {
    34     if(*a==0) return t->n;
    35     if(!t->next[*a-'a']) return 0;/*指针为空,未查找到*/
    36     return query(t->next[*a-'a'],a+1);
    37 }
    38 
    39 int main()
    40 {
    41     trie *t;
    42     t=inti();
    43     char x;
    44     x=getchar();
    45     char a[100];
    46     int r=0;
    47     while(x!='
    ')
    48     {
    49         while(x!='
    ')
    50         {
    51             a[r++]=x;
    52             x=getchar();
    53         }
    54         a[r++]='';
    55         insert(t,a);
    56         x=getchar();
    57         r=0;
    58     }
    59    while(scanf("%s",a)!=EOF)
    60    {
    61        cout<<query(t,a)<<endl;
    62    }
    63 }
    View Code
  • 相关阅读:
    Android UI(四)云通讯录项目之云端更新进度条实现
    [Java 泥水匠] Java Components 之一:Java String (肯定有你不懂的)
    Android UI(三)SlidingMenu实现滑动菜单(详细 官方)
    Android UI(二)DridView的菜单
    Android UI(一)Layout 背景局部Shape圆角设计
    Singly linked list algorithm implemented by Java
    Servlet JSP 二重修炼:Filter过滤器
    HDU 1006 Digital Roots
    2012-2014 三年浙江 acm 省赛 题目 分类
    HDU 1006 Tick and Tick 时钟指针问题
  • 原文地址:https://www.cnblogs.com/ERKE/p/3258918.html
Copyright © 2020-2023  润新知