<题目链接>

统计难题

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. snmp 发送类型ASN_OBJECT_ID

    参考链接: http://blog.csdn.net/yin138/article/details/50388878 ,,,,,,,,,}; int ret = snmp_set_var_typed_ ...

  2. php 设置中文 cookie, js获取

    参考链接:http://www.nowamagic.net/librarys/veda/detail/1271 http://www.ruanyifeng.com/blog/2008/06/base6 ...

  3. B. Planning The Expedition

    题目链接:http://codeforces.com/contest/1011/problem/B 题目大意: 输入的n,m代表n个人,m个包裹. 标准就是 每个人一开始只能选定吃哪一个包裹里的食物, ...

  4. mysql 查询优化 ~explain解读之extra解读

    一 explain 常用状态 1 using filesort 常见于order by 字段 无法走索引造成,文件排序.需要注意优化,复杂条件可以选择建立联合索引进行优化2 using join bu ...

  5. js获取对象的最后一个

    Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和使用 for...in 循环遍历该对象时返回的顺序一致 (两者的主要区别是 一个 for-i ...

  6. Shiro简介及入门(四)

    1.1     什么是shiro shiro是apache的一个开源框架,是一个权限管理的框架,实现 用户认证.用户授权. spring中有spring security (原名Acegi),是一个权 ...

  7. oracle_数据库对象

  8. Debian 无线网卡驱动问题

    参考这里:https://wiki.debian.org/iwlwifi Debian 9 "Stretch" Add a "non-free" compone ...

  9. MoveIt! 源安装

    rosdep update sudo apt-get update sudo apt-get dist-upgrade sudo apt-get install python-wstool pytho ...

  10. VS2013+Win10+opencv3.0配置(包括opencv2.4.10版本)

    在win下配置opencv3.0.0还是比较简单的,这里简单说一下配置过程:参考链接:http://blog.csdn.net/u010009145/article/details/50756751 ...