zoukankan      html  css  js  c++  java
  • hdu 1251 (Trie水题)

    统计难题

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


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

    注意:本题只有一组测试数据,处理到文件结束.
     
    Output
    对于每个提问,给出以该字符串为前缀的单词的数量.
     
    Sample Input
    banana band bee absolute acm ba b band abc
     
    Sample Output
    2 3 1 0
     
    Author
    Ignatius.L
     
    Recommend
    Ignatius.L   |   We have carefully selected several similar problems for you:  1075 1247 1671 1298 1800

    这题就是Trie水题,纯练手用的。但是题目比较坑没给你单词书目。目测十万可过。下面是套模板的Trie:
      1 #include<cstdio>
      2 #include<iostream>
      3 #include<cstring>
      4 #define clr(x) memset(x,0,sizeof(x))
      5 #define clrmin(x) memset(x,-1,sizeof(x))
      6 using namespace std;
      7 struct node
      8 {
      9     int lt,rt;
     10     int val;
     11     int num;
     12     char *c;
     13 };
     14 struct Trie
     15 {
     16     int head,len;
     17     node tr[1000010];
     18     Trie () { clr(tr); head=0; len=1;}
     19     void init()
     20     {
     21         clr(tr); 
     22         head=0;
     23         len=1;
     24         return ;
     25     }
     26     int newnode(char *c)
     27     {
     28         if(!head)
     29         {
     30             head=len;
     31         }
     32         tr[len].c=c;
     33         return len++;
     34     }
     35     void push(int fa,int now,char *str)
     36     {
     37         int p;
     38         if(!now)
     39         {
     40             now=newnode(str);
     41             tr[fa].lt=now;
     42             tr[now].num++;
     43             if(str[1]=='')
     44             {
     45                 tr[now].val++;
     46             }
     47             else
     48                 push(now,0,str+1);
     49             return ;
     50         }
     51         while(now && *tr[now].c!=*str)
     52         {
     53             p=now;
     54             now=tr[now].rt;
     55         }
     56         if(!now)
     57         {
     58             now=newnode(str);
     59             tr[p].rt=now;
     60             tr[now].num++;
     61         }
     62         else
     63             tr[now].num++;
     64         if(str[1]=='')
     65         {
     66             tr[now].val++;
     67         }
     68         else
     69             push(now,tr[now].lt,str+1);
     70         return;
     71     }
     72     int found(int now,char *str)
     73     {
     74         while(now && *tr[now].c!=*str)
     75         {
     76             now=tr[now].rt;
     77         }
     78         if(!now)
     79             return 0;
     80         else
     81             if(strlen(str)==1)
     82                 return tr[now].num;
     83             else
     84                 return found(tr[now].lt,str+1);
     85     }
     86 }tree;
     87 char s[1000010][20],str[20];
     88 int main()
     89 {
     90     int n=0;
     91     tree.init();
     92     while(fgets(str,100,stdin) && strcmp(str,"
    ")!=0)
     93     {
     94         str[strlen(str)-1]='';
     95         strcpy(s[n++],str);
     96         tree.push(0,tree.head,s[n-1]);
     97     }
     98     while(fgets(str,100,stdin)!=NULL)
     99     {
    100         str[strlen(str)-1]='';
    101         printf("%d
    ",tree.found(tree.head,str));        
    102     }
    103     return 0;
    104 }  
  • 相关阅读:
    认识js函数对象(Function Object)
    JavaScript对象就是一组属性(方法)的集合
    XML DOM
    XMLHttpRequest 对象
    js列表分页
    一个重构的js分页类
    Oracle translate 函数的用法, 以及和replace的区别
    使用定时器实现JavaScript的延期执行或重复执行
    PHP四种基本排序算法
    http常见状态码(转载)
  • 原文地址:https://www.cnblogs.com/wujiechao/p/6222936.html
Copyright © 2011-2022 走看看