cogs 647. [Youdao2010] 有道搜索框 Trie树 字典树
647. [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
呜呜 太惨了 就因为一个小小的错误就WA了半天 一定要注意这一道题 只输出字典序最小的前8个 不要超过8个!
这一道题其实就是一个裸的Trie树 如果您还没学过(<<很抱歉 本博主还没有写一篇关于Trie树讲解的博客 还请谅解)
然后再输入的时候把它们全部存起来
每输入一个前缀
就先搜索一下Trie树上能不能搜索到这个前缀
如果不能搜索到 就直接按照题目要求 把这个前缀输出一遍直接完事儿
要是搜到了 就把Trie树dfs一遍 就是在dfs的过程中 在变量中加一个数组 来存储答案字符串
如果当前节点的f是true 就是是一个字符串的结尾 就输出到当前节点为止的字符拍起来形成的字符串
但也要判断 如果已经搜索过8个字符串了 就直接返回return
那么我们不禁心生疑问 那里有处理字典序最小?
哈哈 这个还是非常简单的 因为在trie树的每一个节点不是都有一个for循环来枚举往下接着走那一条边嘛,因为for循环是从小到大的 所以自然针对每一个节点 就先走的更靠前的字典序更小的儿子son 组合起来就是字典序最小的字符串啦
下面上代码 (可能有点长 但是很好理解 哈哈)
#include<bits/stdc++.h>
using namespace std;
struct Trie{
Trie* son[];
bool f;
Trie()
{
for(int i=;i<=;i++)
son[i]=NULL;
f=false;
}
}Root;
int num=;
void dfs(char s[],Trie* p,string ans)
{
if(num==) return;
if(p->f==true)
printf("%s",s),cout<<ans<<" ",num++;
ans+='';
for(int i=;i<;i++)
{
if(p->son[i]==NULL)
continue;
ans[ans.length()-]=i+'a';
dfs(s,p->son[i],ans);
}
}
int main()
{
freopen("youdao.in","r",stdin);
freopen("youdao.out","w",stdout);
int n;
scanf("%d",&n);
for(int i=;i<=n;i++)
{
char s[];
scanf("%s",s);
int len=strlen(s);
Trie* p=&Root;
for(int j=;j<len;j++)
{
int x=s[j]-'a';
if(p->son[x]==NULL)
p->son[x]=new Trie;
p=p->son[x];
}
p->f=true;
}
int q;
scanf("%d",&q);
for(int i=;i<=q;i++)
{
char s[];
scanf("%s",s);
int len=strlen(s);
bool Find=true;
Trie* p=&Root;
string ans="";
for(int j=;j<len;j++)
{
int x=s[j]-'a';
if(p->son[x]==NULL)
{
Find=false;
break;
}
p=p->son[x];
}
if(!Find)
puts(s);
else
dfs(s,p,ans),printf("\n");
num=;
}
return ;
}
cogs 647. [Youdao2010] 有道搜索框 Trie树 字典树的更多相关文章
- Cogs 647. [Youdao2010] 有道搜索框(Trie树)
[Youdao2010] 有道搜索框 ★☆ 输入文件:youdao.in 输出文件:youdao.out 简单对比 时间限制:1 s 内存限制:128 MB [问题描述] 在有道搜索框中,当输入一个或 ...
- 剑指Offer——Trie树(字典树)
剑指Offer--Trie树(字典树) Trie树 Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种的单词.对于每一个单词,我们要判断他出没出现过,如果出现了,求第一次出现在第几个位 ...
- AC自动机——1 Trie树(字典树)介绍
AC自动机——1 Trie树(字典树)介绍 2013年10月15日 23:56:45 阅读数:2375 之前,我们介绍了Kmp算法,其实,他就是一种单模式匹配.当要检查一篇文章中是否有某些敏感词,这其 ...
- Trie(字典树)
没时间整理了,老吕又讲课了@ @ 概念 Trie即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种,典型应用是统计和排序大量的字符串(不限于字符串) Trie字典树主要用于存储字符串, ...
- cogs 293. [NOI 2000] 单词查找树 Trie树字典树
293. [NOI 2000] 单词查找树 ★★☆ 输入文件:trie.in 输出文件:trie.out 简单对比时间限制:1 s 内存限制:128 MB 在进行文法分析的时候,通常需 ...
- Trie - leetcode [字典树/前缀树]
208. Implement Trie (Prefix Tree) 字母的字典树每个节点要定义一个大小为26的子节点指针数组,然后用一个标志符用来记录到当前位置为止是否为一个词,初始化的时候讲26个子 ...
- Trie树 - 字典树
1.1.什么是Trie树 Trie树,即字典树,又称单词查找树或键树,是一种树形结构.典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是最大限 ...
- Trie树/字典树题目(2017今日头条笔试题:异或)
/* 本程序说明: [编程题] 异或 时间限制:1秒 空间限制:32768K 给定整数m以及n个数字A1,A2,..An,将数列A中所有元素两两异或,共能得到n(n-1)/2个结果,请求出这些结果中大 ...
- Trie(前缀树/字典树)及其应用
Trie,又经常叫前缀树,字典树等等.它有很多变种,如后缀树,Radix Tree/Trie,PATRICIA tree,以及bitwise版本的crit-bit tree.当然很多名字的意义其实有交 ...
随机推荐
- web.xml和@WebServlet
web.xml <servlet> <servlet-name>DZDYServlet</servlet-name> <servlet-class>包名 ...
- P1076 单词覆盖还原
题目描述 一个长度为 \(l(3\le l\le 255)\) 的字符串中被反复贴有 boy 和 girl 两单词,后贴上的可能覆盖已贴上的单词(没有被覆盖的用句点表示),最终每个单词至少有一个字符没 ...
- Vant-UI移动端时间选择框
使用Vant input框时有时需要调用时间选择,时间选择框要结合弹出层使用 <div class="van-cell van-field"> <span cla ...
- 深度解读 - TDD详细(测试驱动开发)
本文结构: 什么是 TDD 为什么要 TDD 怎么 TDD FAQ 学习路径 延伸阅读 什么是 TDD TDD 有广义和狭义之分,常说的是狭义的 TDD,也就是 UTDD(Unit Test Driv ...
- H3C查看、删除已经保存配置文件--用户图示(console)以上
<H3C>display saved-configuration //显示已经保存的内容 <H3C>reset saved-configuration //删除 ...
- JRoll 2 适用于移动开发滚动(滑动)——轻量级插件
JRoll,一款能滚起上万条数据,具有滑动加速.回弹.缩放.滚动条.滑动事件等功能,兼容CommonJS/AMD/CMD模块规范,开源,免费的轻量级html5滚动插件. 官网:http://www.c ...
- C++模板特化与偏特化
C++模板 说到C++模板特化与偏特化,就不得不简要的先说说C++中的模板.我们都知道,强类型的程序设计迫使我们为逻辑结构相同而具体数据类型不同的对象编写模式一致的代码,而无法抽取其中的共性,这样显然 ...
- Ubuntu常用命令大全 以及 PHP+MySQL代码部署在Linux(Ubuntu)上注意事项
PHP+MySQL代码部署在Linux(Ubuntu)上注意事项 https://cloud.tencent.com/developer/article/1024187 Ubuntu常用命令大全 ht ...
- 阿里巴巴java开发手册学习记录,php版
一.编程规约 (一)命名风格 1.目录使用小写+下划线 home,view,model,admin_view 2.类 UpperCamelCase PhpMailer方法 lowerCamelCase ...
- 数据多js平均时间取固定条数展示,echarts数据多处理数据
js代码: function getfailurerate(start,end,ip) { $.ajax( { url : "report/getvirtual.action", ...