【Trie】【cogs647】有道搜索框

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

题解:

写一棵trie。对于每一组询问先判断一下是否存在这样一个单词,若存在就开始搜,每搜到一个符合的单词就输出来。

Code:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
char c[30],b[100];
int n,q,ans,num;
struct Trie{
    Trie *son[28]; char ch; bool f;
    Trie(char cc){
        for (int i=0; i<26; i++) son[i]=NULL;
        f=false; ch=cc;
    }
}*root;
void Insert(Trie *x,int w,int len){
    int v=c[w]-‘a‘;
    if (!x->son[v]){
        Trie *y=new Trie(c[w]);
        x->son[v]=y; x=x->son[v];
    }
    else x=x->son[v];
    if (w==len-1){
        x->f=true;
        return;
    }
    Insert(x,w+1,len);
}
bool Judge(Trie *x,int w,int len){
    if (w==len) return true;
    int v=c[w]-‘a‘;
    if (!x->son[v]) return false;
    else Judge(x->son[v],w+1,len);
}
void Query(Trie *x,int w,int len){
    if (w<len)
        Query(x->son[c[w]-‘a‘],w+1,len);
    else {
        if (x->f && ans<8){
            for (int i=0; i<num; i++) printf("%c",b[i]);
            if (w!=len) printf("%c ",x->ch); ans++;
//          cout<<num<<"  "<<ans<<endl;
        }
        for (int i=0; i<26; i++)
            if (x->son[i] && ans<8){
                if (w>len) b[num++]=x->ch;
//              cout<<num<<"  "<<ans<<endl;
                Query(x->son[i],w+1,len);
                if (w>len) num--;
//              cout<<num<<"  "<<ans<<endl;
            }
    }
}
int main(){
    scanf("%d",&n);
    root=new Trie(‘ ‘);
    for (int i=1; i<=n; i++){
        scanf("%s",&c);
        Insert(root,0,strlen(c));
    }
    scanf("%d",&q);
    while (q--){
        scanf("%s",&c); int len=strlen(c);
        if (!Judge(root,0,len)) printf("%s",c);
        else {
            num=len,ans=0; strcpy(b,c);
            Query(root,0,len);
        }
        printf("\n");
    }
    return 0;
}
时间: 2024-08-03 12:00:03

【Trie】【cogs647】有道搜索框的相关文章

有道搜索框的代码--题解

[Youdao2010] 有道搜索框 ★☆ 输入文件:youdao.in 输出文件:youdao.out 简单对比 时间限制:1 s 内存限制:128 MB [问题描述] 在有道搜索框中,当输入一个或者多个字符时,搜索框会出现一定数量的提示,如下图所示: 现在给你 N 个单词和一些查询,请输出提示结果,为了简这个问题,只需要输出以查询词为前缀的并且按字典序排列的最前面的 8 个单词,如果符合要求的单词一个也没有请只输出当前查询词. [输入文件] 第一行是一个正整数 N ,表示词表中有 N 个单词

Ternary Search Tree 应用--搜索框智能提示

前面介绍了Ternary Search Tree和它的实现,那么可以用Ternary Search Tree来实现搜索框的只能提示,因为Ternary Search Tree的前缀匹配效率是非常高的,总体思路如下(其中很多可以根据自己的需要修改,我只是写出我的做法): 比如搜索歌曲时智能提示: 建立Ternary Search Tree 将所有歌曲名的字符串放置在一个map中,key为歌曲名.value存储歌曲信息,可以是一个类对象domain,在这里可以按照key值将相同歌曲的播放次数累加,并

Android零基础入门第62节:搜索框组件SearchView

原文:Android零基础入门第62节:搜索框组件SearchView 一.SearchView概述 SearchView是搜索框组件,它可以让用户在文本框内输入文字,并允许通过监听器监控用户输入,当用户输入完成后提交搜索时,也可通过监听器执行实际的搜索. SearchView默认是展示一个search的icon,点击icon展开搜索框,也可以自己设定图标.用SearchView时可指定如下表所示的常见XML属性及相关方法. 如果为SearchView增加一个配套的ListView,则可以为Se

Android----- 改变图标原有颜色 和 搜索框

本博客主要讲以下两点知识点 图标改变颜色:Drawable的变色,让Android也能有iOS那么方便的图片色调转换,就像同一个图标,但是有多个地方使用,并且颜色不一样,就可以用这个方法了. 搜索框: 一般是EditText实现,本文 实现 TextView图片和文字居中,键盘搜索. 来看看效果图: 图标改变颜色:第一个界面的左边(二维码)和右边(更多)两个实现,我放进去的图片是黑色的,显示出来是白色的. 搜索框:第一个界面的图片和文字居中,还可以设置间距,第二个见面搜索设置键盘搜索按钮,点击搜

模糊查询(类似百度搜索框)

很常见的搜索框,很常用,总结一下,怕自己忘了,使用的是原生的js. 这是原生写的,代码很简单,重要是思路.主要就是用了一个indexOf(),很简单.越简单的东西越难想到,很多人都会想到用正则去做,这样就舍近求远了. html部分: <div id="box"> <input type="text" id="txt" value = ""> <input type="button&quo

微信小程序开发之带搜索记录的搜索框

实现功能:点击搜索框,有搜索记录时以下拉菜单显示,点击下拉子菜单,将数据赋值到搜索框,点击搜索图标搜索,支持清空历史记录,可手动输入和清空查询关键字, UI: wxml: <!--查询历史记录数据--><view class="ddclass" style="margin-left: 50rpx;z-index:80" hidden="{{!StorageFlag}}" style="z-index:100"

POST注入--搜索框

POST注入的分类有很多: 搜索框 登录框 认证框 还有XXXX,总之什么情况就是什么注入 言而总之,都他么一样,不就是POST传数据的时候动点手脚么? 写了个简单的搜索框注入的网页: 代码折叠了,大家展开看 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <title>搜索型注入</title> 5 <meta charset="utf-8"> 6 </head> 7 &l

模拟百度搜索框,输入时显示历史记录

今天写了个小demo,利用本地存储的特点,模拟百度搜索框. 主要知识是利用本地存储的特点,模拟百度搜索时的历史记录显示. 主要HTML代码为 <div class="search"> <input type="text"/> <button class="btn">搜索</button> </div> <ul class="hidden"> <li&

iOS UISearchController 搜索框

#import <Foundation/Foundation.h> @interface Student : NSObject @property(strong,nonatomic) NSString *name; @property(strong,nonatomic) NSString *pic; @property(strong,nonatomic) NSString *tel; -(Student *)initWithDic:(NSDictionary *)dic; +(Student