zoukankan      html  css  js  c++  java
  • ural1542 Autocompletion

    Autocompletion

    Time limit: 2.0 second
    Memory limit: 64 MB
    The Japanese are infinitely in love with machinery that surrounds them. They follow closely all technical innovations and try to use the most modern and clever of them. Den and Sergey have an ingenious plan: they want to create a text editor that will win the Japanese over. The most important feature of the editor will be the autocompletion function. If a user has typed first several letters of a word, then the editor will automatically suggest the most probable endings.
    Den and Sergey have collected a lot of Japanese texts. For each Japanese word they counted the number of times it was found in the texts. For the first several letters entered by a user, the editor must show no more than ten words starting with these letters that are most commonly used. These words will be arranged in the order of decreasing encounter frequencies.
    Help Sergey and Den to turn over the market of text editors.

    Input

    The first line contains the number of words found in the texts N (1 ≤ N ≤ 105). Each of the following N lines contains a word wi and an integer ni separated with a space, where wi is a nonempty sequence of lowercase Latin letters no longer than 15 symbols, and ni (1 ≤ ni ≤ 106) is the number of times this word is encountered in the texts. The (N + 2)th line contains a number M(1 ≤ M ≤ 15000). In each of the next M lines there is a word ui (a nonempty sequence of lowercase Latin letters no longer than 15 symbols), which is the beginning of a word entered by a user.

    Output

    For each of the M lines, output the most commonly used Japanese words starting with ui in the order of decreasing encounter frequency. If some words have equal frequencies, sort them lexicographically. If there are more than ten different words starting with the given sequence, output the first ten of them. The lists of words for each ui must be separated by an empty line.

    Sample

    inputoutput
    5
    kare 10
    kanojo 20
    karetachi 1
    korosu 7
    sakura 3
    3
    k
    ka
    kar
    
    kanojo
    kare
    korosu
    karetachi
    
    kanojo
    kare
    karetachi
    
    kare
    karetachi
    

    分析:若对每个询问走一遍字典树是超时的;

       对于询问建立字典树,然后将排好序的单词依次插入就得到了答案;

    代码:

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cmath>
    #include <algorithm>
    #include <climits>
    #include <cstring>
    #include <string>
    #include <set>
    #include <map>
    #include <queue>
    #include <stack>
    #include <vector>
    #include <list>
    #define rep(i,m,n) for(i=m;i<=n;i++)
    #define rsp(it,s) for(set<int>::iterator it=s.begin();it!=s.end();it++)
    #define mod 1000000007
    #define inf 0x3f3f3f3f
    #define vi vector<int>
    #define pb push_back
    #define mp make_pair
    #define fi first
    #define se second
    #define ll long long
    #define pi acos(-1.0)
    #define pii pair<int,int>
    #define Lson L, mid, rt<<1
    #define Rson mid+1, R, rt<<1|1
    const int maxn=1e6+10;
    using namespace std;
    ll gcd(ll p,ll q){return q==0?p:gcd(q,p%q);}
    ll qpow(ll p,ll q){ll f=1;while(q){if(q&1)f=f*p;p=p*p;q>>=1;}return f;}
    int n,m,k,t,q[maxn],to[maxn],id;
    bool flag;
    char ans[15001][11][21];
    struct node
    {
        char b[21];
        int num;
        bool operator<(const node&p)const
        {
            if(num==p.num)return strcmp(b,p.b)<0;
            else return num>p.num;
        }
    }a[maxn];
    struct node1
    {
        int nxt[26],num;
    }b[maxn];
    char c[21];
    void add(char*c,int tot)
    {
        int now=0;
        for(int i=0;c[i];i++)
        {
            int x=c[i]-'a';
            if(!b[now].nxt[x])b[now].nxt[x]=++id;
            now=b[now].nxt[x];
        }
        if(!b[now].num)b[now].num=tot,to[tot]=tot;
        else to[tot]=b[now].num;
    }
    void gao(char*c)
    {
        int now=0;
        for(int i=0;c[i];i++)
        {
            int x=c[i]-'a';
            if(b[now].nxt[x])
            {
                int y=b[now].nxt[x];
                if(b[y].num&&q[b[y].num]<=9)
                {
                    strcpy(ans[b[y].num][q[b[y].num]++],c);
                }
                now=b[now].nxt[x];
            }
            else break;
        }
    }
    int main()
    {
        int i,j;
        scanf("%d",&n);
        rep(i,1,n)scanf("%s %d",a[i].b,&a[i].num);
        sort(a+1,a+n+1);
        scanf("%d",&m);
        rep(i,1,m)scanf("%s",c),add(c,i);
        rep(i,1,n)gao(a[i].b);
        rep(i,1,m)
        {
            if(flag)printf("
    ");else flag=true;
            rep(j,0,q[to[i]]-1)printf("%s
    ",ans[to[i]][j]);
        }
        //system("Pause");
        return 0;
    }
  • 相关阅读:
    C
    大数模板
    51Nod 1040 最大公约数之和
    欧拉函数
    51Nod 1384 全排列
    B
    A
    B. Mancala (Codeforces Round #478 (Div. 2))
    I
    Requests 入门
  • 原文地址:https://www.cnblogs.com/dyzll/p/5855052.html
Copyright © 2011-2022 走看看