zoukankan      html  css  js  c++  java
  • 洛谷 P2237 [USACO14FEB]自动完成Auto-complete

    题目描述

    Bessie the cow has a new cell phone and enjoys sending text messages, although she keeps making spelling errors since she has trouble typing on such a small screen with her large hooves. Farmer John has agreed to help her by writing an auto-completion app that takes a partial word and suggests how to complete it.

    The auto-completion app has access to a dictionary of W words, each consisting of lowercase letters in the range a..z, where the total number of letters among all words is at most 1,000,000. The app is given as input a list of N partial words (1 <= N <= 1000), each containing at most 1000 lowercase letters. Along with each partial word i, an integer K_i is also provided, such that the app must find the (K_i)th word in alphabetical order that has partial word i as a prefix. That is, if one ordered all of the valid completions of the ith partial word, the app should output the completion that is (K_i)th in this sequence.

    贝西新买了手机,打字不方便,请设计一款应用,帮助她快速发消息。

    字典里有W(W<=30000)个小写字母构成的单词,所有单词的字符总数量不超过1,000,000,这些单词是无序的。现在给出N(1 <= N <= 1000)个询问,每个询问i包含一个的字符串s_i(每个字符串最多包含1000个字符)和一个整数K_i,对于所有以s_i为前缀的单词,其中按字典序排序后的第K_i个单词,求该单词在原字典里的序号。

    输入输出格式

    输入格式:

     

    * Line 1: Two integers: W and N.

    * Lines 2..W+1: Line i+1: The ith word in the dictionary.

    * Lines W+2..W+N+1: Line W+i+1: A single integer K_i followed by a partial word.

     

    输出格式:

     

    * Lines 1..N: Line i should contain the index within the dictionary

    (an integer in the range 1..W) of the (K_i)th completion (in

    alphabetical order) of the ith partial word, or -1 if there

    are less than K_i completions.

     

    输入输出样例

    输入样例#1: 复制
    10 3
    dab
    ba
    ab
    daa
    aa
    aaa
    aab
    abc
    ac
    dadba
    4 a
    2 da
    4 da
    输出样例#1: 复制
    3
    1
    -1

    说明

    OUTPUT DETAILS:

    The completions of a are {aa,aaa,aab,ab,abc,ac}. The 4th is ab, which

    is listed on line 3 of the dictionary. The completions of da are

    {daa,dab,dadba}. The 2nd is dab, listed on line 1 of the dictionary.

    There is no 4th completion of da.

    Source: USACO 2014 Feburary Contest, Silver

    #include<map>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    map<string,int>ma;
    int n,m;
    string s[30010];
    bool judge(string ss,string p){
        int lenp=p.length();
        for(int i=0;i<lenp;i++)
            if(ss[i]!=p[i])    return false;
        return true;
    }
    int main(){
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++){
            cin>>s[i];
            ma[s[i]]=i;
        }
        sort(s+1,s+1+n);
        for(int i=1;i<=m;i++){
            int k;string p;
            scanf("%d",&k);cin>>p;
            int now=lower_bound(s+1,s+1+n,p)-s;
            if(judge(s[now+k-1],p))    printf("%d
    ",ma[s[now+k-1]]);
            else printf("-1
    ");
        }
    }
    二分+排序
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int n,m,k,tot,f;
    string s,p;
    int sum[1000005],id[1000005];
    int trie[1000005][27];
    void insert(int now){
        int len=s.length();
        int root=0;
        for(int i=0;i<len;i++){
            int x=s[i]-'a';
            if(!trie[root][x])    trie[root][x]=++tot;
            sum[trie[root][x]]++;
            root=trie[root][x];
        }
        id[root]=now;
    }
    void dfs(int now){
        if(k==0&&id[now]!=0){
            cout<<id[now]<<endl;f=1;
            return ;
        }
        for(int i=0;i<26;i++){
            if(f==1)    continue;
            if(sum[trie[now][i]]>=k){
                if(id[trie[now][i]]!=0&&k!=0)    k--;
                dfs(trie[now][i]);
            }
            else k-=sum[trie[now][i]];
        }
    }
    void find(){
        int len=p.length();
        int root=0;f=0;
        for(int i=0;i<len;i++){
            int x=p[i]-'a';
            if(!trie[root][x]){
                cout<<"-1"<<endl;
                return ;
            }    
            root=trie[root][x];
        }
        if(sum[root]<k){
            cout<<"-1"<<endl;
            return ;    
        }
        if(id[root])    k--;
        dfs(root);
    }
    int main(){
        //freopen("lpp1.in","r",stdin);
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++){
            cin>>s;
            insert(i);
        }
        for(int i=1;i<=m;i++){
            cin>>k;cin>>p;
            find();
        }
    }
    trie树
  • 相关阅读:
    Internal error:1058 解决方法
    bat抓取文件名
    linux 删除含斜杠的文件的方法
    openoffice启动和自动启动设置(centos)
    Qt-OpenCV使用CMake和MinGW的编译安装及其在Qt配置运行
    MEMS传感器介绍
    嵌入式通信协议-IIC和SPI
    电子设计中-电源地,信号地,大地等知识点总结
    Flash存储器-读写原理及次数
    Qt -在应用程序中嵌入Web内容之环境搭建
  • 原文地址:https://www.cnblogs.com/cangT-Tlan/p/9881574.html
Copyright © 2011-2022 走看看