UPC --- 2018年第三阶段个人训练赛第四场 --- F题 售票(6359)

本文介绍了一种解决自动售票机键盘状态更新问题的算法,通过分析乘客输入的目的地前缀来确定键盘上哪些字母是可用的。文章提供了两种实现方案的代码示例,并解释了如何使用strncmp函数简化字符串匹配过程。

问题 F: 售票

时间限制: 1 Sec  内存限制: 128 MB
提交: 330  解决: 184
[提交] [状态] [讨论版] [命题人:admin]

题目描述

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)。




思路:比赛结束后,看了别人的题解,原来用strncmp就肥肠简单的提取了前缀相同的字符串了,真是一个很好用的工具啊.......然而咸鱼本鱼死磕了2个小时...最后还不知道改了哪里..突然AC,简直要哭泣。(这个代码下面还有比赛AC的代码)

strcnmp的基本操作:http://www.cplusplus.com/reference/cstring/strncmp/

代码:

#include<iostream>
#include<stdio.h>
#include<string>
#include<string.h>
#include<algorithm>
using namespace std;

char a[4][8]={'*','*','*','*','*','*','*','*',
              '*','*','*','*','*','*','*','*',
              '*','*','*','*','*','*','*','*',
              '*','*','*','*','*','*','*','*'};
void print()
{
    for(int i=0; i<4; i++)
    {
        for(int j=0; j<8; j++)
            cout << a[i][j];
        cout << endl;
    }
}

void init()
{
    for(int i=0; i<4; i++)
        for(int j=0; j<8; j++)
            a[i][j] = '*';
}

int main()
{
    int n;
    while(cin >> n)
    {
        init();
        char str[55][105];
        char str0[105];
        for(int i=0; i<n; i++)
            cin >> str[i];
        cin >> str0;
        for(int i=0; i<n; i++)
        {
            int len = strlen(str0);
            if(strncmp(str[i],str0,len) == 0 && strlen(str[i])>len)
            {
                int x = (str[i][len]+4-'A')/8;
                int y = (str[i][len]+4-'A')%8-1;
                    a[x][y] = str[i][len];
            }
        }
        print();
    }
    return 0;
}

 

比赛AC代码: 

#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<stdio.h>
#include<vector>
#include<map>
using namespace std;
char a[4][8] = {'*','*','*','*','*','*','*','*',
                '*','*','*','*','*','*','*','*',
                '*','*','*','*','*','*','*','*',
                '*','*','*','*','*','*','*','*'
               };

void print()
{
    for(int i=0; i<4; i++)
    {
        for(int j=0; j<8; j++)
            cout << a[i][j];
        cout << endl;
    }
}


int main()
{
    int n;
    while(scanf("%d",&n) != EOF)
    {
        vector<char> v[105];
        string ch[55];
        char key[105];
        char ans[105];
        for(int i=0; i<4; i++)
            for(int j=0; j<8; j++)
                a[i][j] = '*';
        for(int i=0; i<n; i++)
            cin >> ch[i];
        scanf("%s",key);
        sort(ch,ch+n);
//        for(int i=0; i<n; i++)
//            cout << ch[i] << endl;
        for(int i=0; i<n; i++)
        {
            int flag0 = 0;
                int len = ch[i].size();
                for(int j=0; j<len; j++)
                {
                    if(ch[i][j] != key[j] && j<strlen(key))
                        break;
                    if(ch[i][j] == key[j])
                    {
                        v[j].push_back(ch[i][j]);
                        flag0 = 1;
                    }
                    else
                    {
                        if(flag0)
                            v[j].push_back(ch[i][j]);
                    }

                }
        }
        int len1 = strlen(key);
        int flag = 0;
        for(int i=0; i<len1; i++)
        {
            int len2 = v[i].size();
            for(int j=0; j<len2; j++)
            {
                if(v[i][j] == key[i])
                {
                    flag = 0;
                    break;
                }
                else
                    flag = 1;
            }
        }
        for(int i=0; i<v[len1].size(); i++)
            ans[i] = v[len1][i];
        int l = strlen(ans);
        if(flag == 0)
        {
            for(int i=0; i<l; i++)
            {
                int x = (ans[i]-'A'+4)/8;
                int y = (ans[i]-'A'+4)%8-1;
                a[x][y] = ans[i];
            }
        }
        print();
    }
    return 0;
}

 

欢迎指正与交流

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值