ACM___________________________

______________白白の屋
posts - 182, comments - 102, trackbacks - 0, articles - 0

MiYu原创, 转帖请注明 : 转载自 ______________白白の屋    

 

题目地址:

     http://acm.hdu.edu.cn/showproblem.php?pid=1251 

题目描述:

统计难题

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


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 树, 教程很容易看明白, 1251 是一道很明显的 模板题, 看过 PPT 后 直接敲代码 1A.

第一次做, 顺便介绍下 trie树 :

字典树(Trie)是一种用于快速字符串检索的多叉树结构。其原理是利用字符串的公共前缀来降低时空开销,从而达到提高程序效率的目的。

  它有如下简单的性质:

    (1) 根节点不包含字符信息;

    (3) 一棵m度的Trie或者为空,或者由m棵m度的Trie组成。

   搜索字典项目的方法为:

    (1) 从根结点开始一次搜索;

    (2) 取得要查找关键词的第一个字母,并根据该字母选择对应的子树      并转到该子树继续进行检索;

    (3) 在相应的子树上,取得要查找关键词的第二个字母,

      并进一步选择对应的子树进行检索。

    (4) 迭代过程……

    (5) 在某个结点处,关键词的所有字母已被取出,则读取

      附在该结点上的信息,即完成查找。

代码如下 :

    当然也可以拿来做模板 ,    

 /*

MiYu原创, 转帖请注明 : 转载自 ______________白白の屋

          http://www.cnblog.com/MiYu

Author By : MiYu

Test      : 1

Program   : 1251

*/


#include <iostream>

using namespace std;

typedef struct dict DIC;

struct dict {

       dict (){ n = 0; memset ( child , 0 , sizeof ( child ) ); }

       void insert ( char *ins )

       {

            DIC *cur = this,*now;

            int len = strlen ( ins );

            if ( len == 0 )  return ;

            for ( int i = 0; i != len; ++ i )

            {

                  if ( cur->child[ ins[i] - 'a' ] != NULL ) 

                  {

                       cur = cur->child[ ins[i] - 'a' ];

                       cur->n ++; 

                  }

                  else

                  {

                       now = new DIC;

                       cur->child[ ins[i] - 'a' ] = now;

                       now->n ++;

                       cur = now;

                  }

            } 

       }

       int find ( char *ins )

       {

            DIC *cur = this;

            int len = strlen ( ins );

            if ( 0 == len )  return 0;

            for ( int i = 0; i != len; ++ i )

            {

                 if ( cur->child[ ins[i] - 'a' ] != NULL )

                      cur = cur->child[ ins[i] - 'a' ];  

                 else

                      return 0; 

            } 

            return cur->n;

       }

private:

       DIC *child[26];

       int n; 

};

char word[11];

int main ()

{

    DIC dict;

    while ( gets ( word ), strcmp ( word, "") != 0 )

          dict.insert ( word );

    char qur[11];

    while ( scanf ( "%s",qur ) != EOF )

    {

          printf ( "%d\n",dict.find ( qur ) ); 

    }    

    return 0;

}


 

 


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理