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

Input
输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串.

注意:本题只有一组测试数据,处理到文件结束.

Output
对于每个提问,给出以该字符串为前缀的单词的数量.

Sample Input
banana
band
bee
absolute
acm

ba
b
band
abc

Sample Output
2
3
1
0

----------------------------------------------------------我是分割线--------------------------------------------------------------------------

这道题是用来熟悉字典树模板的题目,看起来的确是有难度,不过手动抄一遍之后就应该能大概熟悉了,
大概的算法思路就是遇到新的字母不在序列内的字母就加入新节点,如果存在就继续按照此节点添加,
难度也就是在于理解这几步了,不过在杭电的G++似乎和C++不同,应该是malloc函数或者指针的问题吧,
所以本题在HDU上做的时候记得使用C++提交,下面给出代码:

#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
using namespace std;

#define MX 26

struct Trie {
  int v;
  Trie *next[MX];
}root;

void createTrie(char str[]) {
  Trie *p = &root, *q;
  int len = strlen(str);
  for (int i = 0; i < len; i++) {
    int id = str[i] - 'a';//将二十六个字母转换成序列
    if (p -> next[id] == NULL) {//如果该节点不存在,即这是一个没有记录的字母,就开始申请内存,就类似于创建一颗新树
      q = (Trie*)malloc(sizeof(root));
      q -> v = 1;
      for (int j = 0; j < MX; j++) q -> next[j] = NULL;
      p -> next[id] = q;
      p = p -> next[id];
    } else {
      p -> next[id] -> v++;//统计以此为前缀的字符或者字符串个数
      p = p -> next[id];
    }
  }
}

int findTrie(char str[]) {
  Trie *p = &root;
  int len = strlen(str);
  for (int i = 0; i < len; i++) {
    int id = str[i] - 'a';
    if (p -> next[id] != NULL) {
      p = p -> next[id];
    } else {
      return 0;//如果这个字符串还没有判断完而字典树就结束了,就说明字典树中没有这个字符串
    }
  }
  return p -> v;//如果有这个字符串,就把以这个字符串为前缀的字符串数目全部返回
}
//注意,如果有的题目最后发生内存爆炸的情况,请把申请来的内存空间全部释放掉,使用free()函数
int main() {
  //freopen("input.txt", "r", stdin);
  char str[15];
  while(gets(str) && str[0] != '\0') createTrie(str);//每读一个字符串就传入createTrie()进行创建
  while (scanf("%s", str) != EOF) {
    int ans = findTrie(str);
    printf("%d\n", ans);
  }
  return 0;
}

 

HDU-统计难题的更多相关文章

  1. hdu 统计难题(map)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1251 map的强大之处,但是运行时间太长. 代码: #include <stdio.h> ...

  2. hdu 1251 统计难题 (字典树入门题)

    /******************************************************* 题目: 统计难题 (hdu 1251) 链接: http://acm.hdu.edu. ...

  3. HDU 1251 统计难题(Trie模版题)

    统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others) Total Subm ...

  4. hdu 1251 统计难题(字典树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1251 统计难题 Time Limit: 4000/2000 MS (Java/Others)    M ...

  5. HDU 1251统计难题

    统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)Total Submi ...

  6. hdu 1251:统计难题(字典树,经典题)

    统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)Total Submi ...

  7. hdu 1251 统计难题 trie入门

    统计难题 Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本 ...

  8. [ACM] hdu 1251 统计难题 (字典树)

    统计难题 Problem Description Ignatius近期遇到一个难题,老师交给他非常多单词(仅仅有小写字母组成,不会有反复的单词出现),如今老师要他统计出以某个字符串为前缀的单词数量(单 ...

  9. HDU 1251 统计难题 (字符串-Trie树)

    统计难题 Problem Description Ignatius近期遇到一个难题,老师交给他非常多单词(仅仅有小写字母组成,不会有反复的单词出现),如今老师要他统计出以某个字符串为前缀的单词数量(单 ...

  10. AC日记——统计难题 hdu 1251

    统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)Total Submi ...

随机推荐

  1. 微信支付 - V3支付问题

    参考资料:http://www.2cto.com/weixin/201506/407690.html   1.微信公众号支付出错: 当前页面的URL未注册: get_brand_wcpay_reque ...

  2. Overview and Evaluation of Bluetooth Low Energy: An Emerging Low-Power Wireless Technology

    转自:http://www.mdpi.com/1424-8220/12/9/11734/htm Sensors 2012, 12(9), 11734-11753; doi:10.3390/s12091 ...

  3. Delphi中线程类TThread实现多线程编程2---事件、临界区、Synchronize、WaitFor……

    接着上文介绍TThread. 现在开始说明 Synchronize和WaitFor 但是在介绍这两个函数之前,需要先介绍另外两个线程同步技术:事件和临界区 事件(Event) 事件(Event)与De ...

  4. js setTimeout运用

    js setTimeout运用 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "ht ...

  5. TortoiseSVN常用操作说明

    TortoiseSVN是windows下其中一个非常优秀的SVN客户端工具.通过使用它,我们可以可视化的管理我们的版本库.不过由于它只是一个客户端,所以它不能对版本库进行权限管理. TortoiseS ...

  6. Macbook Pro安装win7

    1.进入OS X系统,在实用工具中打开Boot Camp助理 2.用磁盘工具对磁盘进行分区,将需要安装win7的分区格式化成FAT格式 3.用Boot Camp对磁盘进行分割,然后插入win7的安装光 ...

  7. 难得的中文ASP.NET 5/MVC 6入门教程

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:由于ASP.NET 5还未正式发布,即使是官方文档都还不完善,更不要说系统的中文文档了 ...

  8. 第六篇:在SOUI中用九宫格拉伸方式显示一个图片资源

    SOUI的初学者刚开始可能难以搞清楚在SOUI中显示一个图片资源的流程,这里做一个简单的示范. 首先我们准备好一张图,以下图为例. 第一步,我们首先把这个图片文件复制到demo的uires目录下,新建 ...

  9. VS2012 OpenCV2.4.9 Debug可以允许,Release不可以

    一个简单的程序 #include <iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgu ...

  10. 【转】html、css、js文件加载顺序及执行情况

    原链接:http://www.cnblogs.com/Walker-lyl/p/5262075.html 今天看书,看到html,css,js加载执行情况,发现自己并不是真正的了解,网上搜了半小时依然 ...