Cogs 647. [Youdao2010] 有道搜索框(Trie树)
2017-01-16 17:52
447 查看
[Youdao2010] 有道搜索框
★☆ 输入文件:youdao.in 输出文件:youdao.out 简单对比
时间限制:1 s 内存限制:128 MB
【问题描述】
在有道搜索框中,当输入一个或者多个字符时,搜索框会出现一定数量的提示,如下图所示:
现在给你 N 个单词和一些查询,请输出提示结果,为了简这个问题,只需要输出以查询词为前缀的并且按字典序排列的最前面的 8 个单词,如果符合要求的单词一个也没有请只输出当前查询词。
【输入文件】
第一行是一个正整数 N ,表示词表中有 N 个单词。
接下来有 N 行,每行都有一个单词,注意词表中的单词可能有重复,请忽略掉重复单词。所有的单词都由小写字母组成。
接下来的一行有一个正整数 Q ,表示接下来有 Q 个查询。
接下来 Q 行,每行有一个单词,表示一个查询词,所有的查询词也都是由小写字母组成,并且所有的单词以及查询的长度都不超过 20 ,且都不为空
其中: N<=10000,Q<=10000
【输出文件】
对于每个查询,输出一行,按顺序输出该查询词的提示结果,用空格隔开。
【样例输入】
youdao.in
10
a
ab
hello
that
those
dict
youdao
world
your
dictionary
6
bob
d
dict
dicti
yo
z
【样例输出】
youdao.out
bob
dict dictionary
dict dictionary
dictionary
youdao your
z
★☆ 输入文件:youdao.in 输出文件:youdao.out 简单对比
时间限制:1 s 内存限制:128 MB
【问题描述】
在有道搜索框中,当输入一个或者多个字符时,搜索框会出现一定数量的提示,如下图所示:
现在给你 N 个单词和一些查询,请输出提示结果,为了简这个问题,只需要输出以查询词为前缀的并且按字典序排列的最前面的 8 个单词,如果符合要求的单词一个也没有请只输出当前查询词。
【输入文件】
第一行是一个正整数 N ,表示词表中有 N 个单词。
接下来有 N 行,每行都有一个单词,注意词表中的单词可能有重复,请忽略掉重复单词。所有的单词都由小写字母组成。
接下来的一行有一个正整数 Q ,表示接下来有 Q 个查询。
接下来 Q 行,每行有一个单词,表示一个查询词,所有的查询词也都是由小写字母组成,并且所有的单词以及查询的长度都不超过 20 ,且都不为空
其中: N<=10000,Q<=10000
【输出文件】
对于每个查询,输出一行,按顺序输出该查询词的提示结果,用空格隔开。
【样例输入】
youdao.in
10
a
ab
hello
that
those
dict
youdao
world
your
dictionary
6
bob
d
dict
dicti
yo
z
【样例输出】
youdao.out
bob
dict dictionary
dict dictionary
dictionary
youdao your
z
/* Trie. 不过加了一个print过程. 建树记一下单词结尾. 构造一个串输出即可. */ #include<iostream> #include<cstdio> #include<cstring> #define MAXN 100001 using namespace std; int n,m,tot; char ss[MAXN],ch[MAXN]; struct data{int next[27],tot;bool b;}tree[MAXN*2]; void add(char s[],int l) { int now=0; for(int i=0;i<l;i++) { int x=s[i]-96; if(tree[now].next[x]) now=tree[now].next[x]; else tot++,tree[now].next[x]=tot,now=tot; } tree[now].b=true; } void dfs(int now,int &sum,int len) { if(sum>=8) return ; if(tree[now].b) sum++,printf("%s ",ch); for(int i=1;i<=26;i++) { if(tree[now].next[i]) { ch[len]=i+96; dfs(tree[now].next[i],sum,len+1); ch[len]=0; } } } void query(char s[],int l) { int now=0,sum=0,x; for(int i=0;i<l;i++) { x=s[i]-96; if(!tree[now].next[x]){cout<<s<<endl;return ;} now=tree[now].next[x]; } memset(ch,0,sizeof ch); for(int i=0;i<l;i++) ch[i]=s[i]; dfs(now,sum,l); printf("\n"); } int main() { freopen("youdao.in","r",stdin); freopen("youdao.out","w",stdout); scanf("%d",&n); for(int i=1;i<=n;i++) { cin>>ss+1; int l=strlen(ss+1); add(ss+1,l); } scanf("%d",&m); for(int i=1;i<=m;i++) { cin>>ss+1; int l=strlen(ss+1); query(ss+1,l); } return 0; }
相关文章推荐
- Centos 7.2 安装 Ambari 2.2.2 + HDP 2.4.2 搭建Hadoop集群
- pyhton tab 自动补全
- 安装Protobuf时候需要安装gmock的问题
- BZOJ 1911: [Apio2010]特别行动队[斜率优化dp]
- 爬虫代码实现五:解析所有分页url并优化解析实现类
- 一个简单的网页服务器
- RabbitMQ消息队列(五):Routing 消息路由
- MVC4设置@Html.BeginForm的ID
- linux 平台中 android中system.img的打包过程
- Hdu 1247 Hat's Words(Trie树)
- Codeforces Round #362
- splay详解(pascal&C++版)
- MySQL - 新增一列和查找主键
- RabbitMQ (四) 路由选择 (Routing)
- ubuntu 16.04 下安装smplayer视频播放器
- Docker集群实验环境布署--swarm【7 让docker客户端支持docker-compose】
- 2017-01-07 复合模式、代理模式
- git回滚到任意版本
- echarts data 赋值
- app发送cmd命令