<题目链接>

统计难题

Problem Description
Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).
Input
输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串.
注意:本题只有一组测试数据,处理到文件结束.
 
Output
对于每个提问,给出以该字符串为前缀的单词的数量.
 
Sample Input
banana
band
bee
absolute
acm
 
ba
b
band
abc
 
Sample Output
2
3
1
0
 
tire树指针实现:
 #include <cstdio>
#include <malloc.h>
#include <cstring>
#include <algorithm>
using namespace std; char s[];
struct node{
int cnt;
node *next[]; //该节点的所有子节点
void init(){ //初始化该节点
cnt=;
for(int i=;i<;i++)
next[i]=NULL;
}
};
void insert(node *root,char *s){
node *p =root ,*now;
for(int i=;s[i];i++){
int tmp=s[i]-'a';
if(p->next[tmp]==NULL){ //如果该节点为空,则创建一个新的节点
p->next[tmp]=new node;
p=p->next[tmp];
p->init();
}
else p=p->next[tmp]; //如果该节点不空,则继续向下插入
p->cnt++; //以该节点结尾的前缀个数+1
}
}
int find(node *root,char *s){
node *p=root;
for(int i=;s[i];i++){
int tmp=s[i]-'a';
p=p->next[tmp];
if(!p)return ; //如果遇到不满足的节点,就直接结束
}
return p->cnt;
}
int main(){
node *root=new node;
root->init();
while(gets(s)&&strlen(s))
insert(root,s);
while(gets(s))
printf("%d\n",find(root,s));
return ;
}

trie树数组实现:

 #include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int N = 1e6+;
int trie[N][]; //trie[now][next]代表第一次遍历到该节点的序号
int num[N]={},pos=;
void Insert(char *str){
int now=;
for(int i=;str[i];i++){
int next=str[i]-'a';
if(!trie[now][next])trie[now][next]=++pos; //如果没有遍历过该节点,就给该节点赋值(相当于给trie树创建一个节点)
now=trie[now][next];
num[now]++; //该前缀的数量+1
}
}
int Search(char *str){
int now=;
for(int i=;str[i];i++){
int next=str[i]-'a';
if(!trie[now][next])return ; //只要一找到不符合的节点,就直接返回0
now=trie[now][next]; //当前节点继续向下匹配
}
return num[now];
}
int main(){
char str[];
while(gets(str)&&strlen(str))
Insert(str);
while(gets(str))
printf("%d\n",Search(str));
return ;
}

map做法

#include <cstdio>
#include <string>
#include <map>
#include <iostream>
#include <algorithm>
using namespace std; int main()
{
string s, str[];
int cur = ;
map<string, int>mapp;
while (getline(cin, s) && s[] != '\0') //注意是用这个来判断空行,首先一定要用getline读入,其次是s[0]=='\0'时表示是空行
{
string ss;
for (int i = ; i <=s.length(); i++) {
ss = s.substr(, i); //获得字符串s中从第0位开始的长度为i的字符串
mapp[ss]++;
}
}
while (cin >> s)
{
printf("%d\n", mapp[s]);
}
return ;
}
 
2018-04-08

hdu 1251:统计难题[【trie树】||【map】的更多相关文章

  1. HDU - 1251 统计难题(trie树)

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

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

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

  3. HDOJ/HDU 1251 统计难题(字典树啥的~Map水过)

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

  4. hdu 1251 统计难题 (字典树(Trie)<PS:C++提交不得爆内存>)

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

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

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

  6. hdu 1251 统计难题 trie入门

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

  7. HDU 1251 统计难题(Trie)

    统计难题 [题目链接]统计难题 [题目类型]Trie &题解: Trie的模板题,只不过这题坑点在没给数据范围,改成5e5就可以过了,用的刘汝佳蓝书模板 &代码: #include & ...

  8. hdu 1251 统计难题 字典树第一题。

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

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

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

  10. HDU 1251 统计难题 字典树大水题

    今天刚看的字典树, 就RE了一发, 字典树原理还是很简单的, 唯一的问题就是不知道一维够不够用, 就开的贼大, 这真的是容易MLE的东西啊, 赶紧去学优化吧. HDU-1251 统计难题 这道题唯一的 ...

随机推荐

  1. [转]Linux/Windows下脚本对拍程序

    [新]简单写法 (转载自:https://blog.csdn.net/ylsoi/article/details/79824655) 要求:文件输入输出,且输入输出文件需要对应 Linux: #inc ...

  2. MySql 安装与使用图文教程

    MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司.MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内, ...

  3. mongodb系列~ mongodb慢语句(3)

    简介: 关于mongodb慢日志是如何收集 一 mongodb慢日志的开启 1 直接设置参数,不重启服务:db.setProfilingLevel(1) 2 添加启动参数,重启服务:添加profile ...

  4. 修正iOS从照相机和相册中获取的图片方向

    使用系统相机拍照得到的图片的默认方向有时不是ImageOrientationDown,而是ImageOrientationLeft,在使用的时候会出现图片顺时针偏转90°.使用fixOrientati ...

  5. C++ Boost库简介(转载)

    boost是一个准标准库,相当于STL的延续和扩充,它的设计理念和STL比较接近,都是利用泛型让复用达到最大化.不过对比STL,boost更加实用.STL集中在算法部分,而boost包含了不少工具类, ...

  6. [转]AMBA、AHB、APB、ASB总线简介

    [转]http://www.cnblogs.com/zhaozhong1989/articles/3092140.html 1.前言 随着深亚微米工艺技术日益成熟,集成电路芯片的规模越来越大.数字IC ...

  7. 单个 LINQ to Entities 查询中的两个结构上不兼容的初始化过程中出现类型“XXXX”

    最近在做一个报表的时候,用EF使用了Contact方法,但是程式运行一直出错.最近终于找到原因了,写下来提醒下自己.好了,进入正题: 现在我举个栗子,目前数据库中有ParentStudent表和Sub ...

  8. centos6.5环境使用RPM包离线安装MariaDB 10.0.20

    1. 进入MariaDB官网下载MariaDB需要的RPM包 2. 使用下载软件下载所需要的RPM包, 总共4个, 并上传到CentOS主机指定目录. MariaDB-10.0.20-centos6- ...

  9. TCP/IP五层层次模型

    TCP/IP层次模型共分为五层:应用层HTTP.传输层TCP.网络层IP.数据链路层Data-link.物理层physical.·         应用层-应用层是所有用户所面向的应用程序的统称.IC ...

  10. 大道至简、大智若愚—GO语言最佳详解实践

      导读:2007年,受够了C++煎熬的Google首席软件工程师Rob Pike纠集Robert Griesemer和Ken Thompson两位牛人,决定创造一种新语言来取代C++, 这就是Gol ...