问题 F: 售票
时间限制: 1 Sec 内存限制: 128 MB
提交: 303 解决: 172
题目描述
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()函数,比较前n个长度的字符串。
n+1就是最后输出的键盘有可能的字母。
这里先将键盘全部初始化为“*”;
丑代码如下:
#include<cstdio>
#include<cstring>
#include<math.h>
#include<algorithm>
#include<queue>
#include<vector>
#include<iostream>
#include<map>
#define mes(a,b) memset(a,b,sizeof(a))
#define rep(i,m,n) for(i=m;i<=n;i++)
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
int max3(int a,int b,int c){return max(max(a,b),c);}
ll min3(ll a,ll b,ll c){return min(min(a,b),c);}
const double PI=acos(-1);
const int inf=0x3f3f3f3f;
const long long int Inf=0x3F3F3F3F3F3F3F3Ell;
const double esp=1e-6;
const int maxn=1e6+5;
const int mod=1e9+7;
int dir[4][2]={0,1,1,0,0,-1,-1,0};
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}//最大公因数
ll lcm(ll a,ll b){return a/gcd(a,b)*b;}//最小公倍数
ll inv(ll b){if(b==1)return 1; return (mod-mod/b)*inv(mod%b)%mod;}
ll fpow(ll n,ll k){ll r=1;for(;k;k>>=1){if(k&1)r=r*n%mod;n=n*n%mod;}return r;}
ll Fpow(ll n,ll k){ll r=1;for(;k;k>>=1){if(k&1)r=r*n;n=n*n;}return r;}//快速幂
int n,l;
char a[55][105],s[105];
char ans[]={"********\n********\n********\n********"};
int main(){
scanf("%d\n",&n);
for(int i=0;i<n;i++)
scanf("%s",a[i]);
scanf("%s",s);
l=strlen(s);
for(int i=0;i<n;i++)
if(!strncmp(a[i],s,l)){
char c=a[i][l];
if('A'<=c&&c<='E') ans[c-'A'+3]=c;
if('F'<=c&&c<='M') ans[c-'A'+4]=c;
if('N'<=c&&c<='U') ans[c-'A'+5]=c;
if('V'<=c&&c<='Z') ans[c-'A'+6]=c;
}
puts(ans);
}