• UPC-6359 售票(字典树)


    题目描述
    C 市火车站最近出现了一种新式自动售票机。买票时,乘客要先在售票机上 输入终点名称。一共有 N 处目的地,随着乘客按顺序输入终点名称的每个字母, 候选终点站数目会逐渐减少。
    在自动售票机屏幕上,有一个 4 行 8 列的键盘,如下图所示。
    这里写图片描述

    在乘客每输入一个字母后,键盘上只有有效字符是可选的(取决于还有哪些 候选终点站),其余的字母会被字符 ’*’ 取代。
    告诉你 N 处目的地的名称,以及乘客已经输入的若干字符,请你输出键盘目 前的状态。

    输入
    第一行为一个整数 N(1 ≤ N ≤ 50)。接下来 N 行,每行一个由大写英文字母 组成的长度不超过 100 的字符串,表示一处目的地。最后一行,一个长度不超过
    100 的字符串,表示按顺序输入的若干字符。

    输出
    输出4行,每行一个长度为8的字符串,表示键盘状态。

    样例输入
    4
    ZAGREB
    SISAK
    ZADAR
    ZABOK
    ZA

    样例输出
    .* * * * B * D *
    .* G * * * * * *
    .* * * * * * * *
    .* * * * * * * *

    提示
    输入 ZA 以后,下一个字符可能是 G(终点站有可能是 ZAGREB),或 D(终点 站有可能是 ZADAR),或 B(终点站有可能是 ZABOK)。

    明显就是输入索引,那么建一个字典树,按照输入的字母走一遍字典树,在那里停止就查询该节点存在多少个孩子。输出即可

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=5e5+10;
    int n,tot;
    int tre[maxn][26];
    int insert(char *str,int rt)
    {
        for(int j=0; str[j]; j++)
        {
            int x=str[j]-'A';
            if(tre[rt][x]==0)
                tre[rt][x]=++tot,memset(tre[tre[rt][x]],0,sizeof(tre[tre[rt][x]]));
            rt=tre[rt][x];
        }
    }
    int finds(char str[],int rt)
    {
        int len=strlen(str);
        for(int i=0; i<len; i++)
        {
            int x=str[i]-'A';
            if(tre[rt][x]==0)return 0;
            rt=tre[rt][x];
        }
        return rt;
    }
    int main()
    {
        while(scanf("%d",&n)!=EOF)
        {
            int tot=0;
            int rt=tot++;
            memset(tre[rt],0,sizeof tre[rt]);
            char a[105];
            for(int i=0; i<n; i++)
                scanf("%s",a),insert(a,rt);
            scanf("%s",a);
            int ans=finds(a,rt);
            for(int i=1; i<=32; i++)
            {
                if(i>=1&&i<=3||i>=30&&i<=32)printf("*");
                else
                {
                    if(tre[ans][i-4]!=0)printf("%c",i-4+'A');
                    else printf("*");
                }
                if(i%8==0)printf("
    ");
            }
        }
    }
  • 相关阅读:
    C语言I博客作业09
    请看这里
    C++ 面向对象学习笔记[1]
    graphviz的使用
    KDE安装后的一些随笔
    近期内容整理
    链表
    理解C++ lvalue与rvalue
    再看“笕实智慧校园”——作品的复盘[1]
    无题
  • 原文地址:https://www.cnblogs.com/kuronekonano/p/11135735.html
Copyright © 2020-2023  润新知