• [第四场T2]Kartomat


    题目描述

    售票机是一种类似于ATM的设备,由克罗地亚铁路公司推出,以便人们更容易购买火车票。买票的第一步是选择旅程的目的地。目的地可以是提供的N个地点之一,包括当地和世界其他地区。您可以通过逐字母键入其名称来选择目的地。随着多输入字母,目的地的可能选择会减少。

    avatar

    屏幕上键盘的初始外观如上图所示。我们将它表示为长度为8的四个字符数组。 每当输入一个字母,键盘会改变其外观。只有在下一步中可以选择的字母才会保持活动状态(取决于仍可选择的目的地)。无法选择的剩余字母将替换为字符“*”。 编写一个程序,对于N个给定目的地和所选目的地的前几个字母(不是全部),输出当前键盘的外观。数据保证不会有已经输入完目的地的情况。

    输入

    第一行输入包含一个整数N(1≤N≤50)。表示目的地的个数。

    接下来N行每行包含一个只由大写英文字母组成的字符串,每个字符串的长度都不超过100。每个字符串表示了一个目的地。

    接下来一行包含了一个字符串,表示输入的目的地的前几个字母。

    输出

    输出四行,每行包含一个长度为8的字符串。表示指定格式下的当前键盘的外观。

    样例输入

    4
    ZAGREB
    SISAK
    ZADAR
    ZABOK
    ZA

    样例输出

    ****B*D*
    *G******
    ********
    ********

    解题思路

    当场MLE,怪我乱开数组,以及非要用字典树....

    字典树其实很好做的,你insert完,然后再find一下,最后标记一下就好了。

    AC(MLE)代码

    #include<cstdio>
    #include<cstring>
    #include<queue>
    #include<iostream>
    #include<algorithm>
    #include<vector>
    #include<cmath>
    using namespace std;
    int tree[1000005][30];//f**k
    int n,cnt = 1,cnt1;
    bool ans[30];
    char s[105],c[105];
    void insert(char *s){
    	int p = 0;
    	int len = strlen(s + 1);
    	for (int i = 1;i <= len;i ++){
    		int z = s[i] - 'A';
    		if (!tree[p][z])
    			tree[p][z] = ++ cnt;
    		p = tree[p][z];
    	}
    }
    void find(char *s){
    	int p = 0;
    	int len = strlen(s + 1);
    	for (int i = 1;i <= len;i ++){
    		int z = s[i] - 'A';
    		p = tree[p][z];
    	}
    	for (int i = 'A';i <= 'Z';i ++)
    		if (tree[p][i - 'A'])
    			ans[i - 'A'] = 1;
    }
    int main(){
    	//freopen("kartomat.in","r",stdin);
    //	freopen("kartomat.out","w",stdout);
    	scanf ("%d",&n);
    	for (int i = 1;i <= n;i ++){
    		scanf ("%s",s + 1);
    		insert(s);
    	}
    	scanf ("%s",c + 1);
    	find(c);
    	for (int i = 1;i <= 4;i ++){
    		for (int j = 1;j <= 8;j ++){
    			if ((i == 1 && j <= 3) || ((i == 4) && (j >= 6))){
    				printf("*");
    				continue;
    			}
    			if (ans[cnt1])
    				printf("%c",cnt1 + 'A');
    			else 
    				printf("*");
    			cnt1 ++;
    		}
    		printf("
    ");
    	}
    }

    然后就是暴力官方题解。

    暴力枚举前缀,相同的话标记下一个字母即可

    #include<cstdio>
    #include<cstring>
    #include<queue>
    #include<iostream>
    #include<algorithm>
    #include<vector>
    #include<cmath>
    using namespace std;
    int n,cnt1;
    bool ans[30];
    char s[105][105],c[105];
    bool check(char *a,char *b){
    	for (int i = 1;i <= strlen(b + 1);i ++)
    		if (a[i] != b[i])
    			return 0;
    	return 1;
    }
    int main(){
    	//freopen("kartomat.in","r",stdin);
    	//	freopen("kartomat.out","w",stdout);
    	scanf ("%d",&n);
    	for (int i = 1;i <= n;i ++)
    		scanf ("%s",s[i] + 1);
    	scanf ("%s",c + 1);
    	for (int i = 1;i <= n;i ++){
    		if (check(s[i],c))
    			ans[s[i][strlen(c + 1) + 1] - 'A'] = 1;
    	}
    	for (int i = 1;i <= 4;i ++){
    		for (int j = 1;j <= 8;j ++){
    			if ((i == 1 && j <= 3) || ((i == 4) && (j >= 6))){
    				printf("*");
    				continue;
    			}
    			if (ans[cnt1])
    				printf("%c",cnt1 + 'A');
    			else 
    				printf("*");
    			cnt1 ++;
    		}
    		printf("
    ");
    	}
    }
  • 相关阅读:
    缩略图(转载)
    MarteEngine tutorial:Keyboard and mouse input
    MarteEngine tutorial: Hello World
    FengGUI
    位于两个内网的结点A和B都连接到一个公网的rdv,然后A与B之间发送消息,这时消息是否还经过rdv?
    MarteEngine
    MarteEngine tutorial:Basic collision
    关于PresenceService的实现方式
    MarteEngine: Animate sprite
    MarteEngine tutorial: 设置你的环境
  • 原文地址:https://www.cnblogs.com/lover-fucker/p/13566671.html
Copyright © 2020-2023  润新知