[COCI2014-2015#2] MOBITEL

题目描述

蚱蜢 Marko 高兴地在草地上跳来跳去。他不小心,他的手机掉进了水坑。他的手机现在触键弄湿了,键盘的工作方式完全不可预知!所有的数字键都坏了。当我们按下其中一个键时,手机就好像我们按下了另一个键一样。幸运的是,没有两个键按下后的作用是一样的,所以 Marko 仍然可以写出所有的字母。

蚱蜢 Marko 正在做一些实验以找出每个键的动作。现在他想给他的女朋友写封信。因为他只是一只蚱蜢,所以它需要你帮忙。

对于那些不记得手机的按键是如何工作的人,这里有一个简短的描述。

这张图片显示了我们可以通过按那个键(在一个没有掉进水坑的工作手机上)得到的带有字母的按键。例如,如果我们想要字母 a,我们将按一次键 2,如果我们想要字母 b,我们将按两次键 2。如果我们想连续用同一个键写两个字母,我们必须按一次键 #。例如,如果要编写字符串 klor,我们将按以下顺序按键:55#555666777

输入格式

第一行输入包含 9 9 9 个整数。第一个整数表示按下键 1 的作用相当于原来的哪个键,第二个表示按下键 2 的作用相当于原来的哪个键,第三个表示表示按下键 3 的作用相当于原来的哪个键,依此类推。马尔科不会使用 *0 键。键 # 不会坏。

第二行输入包含一个字符串 s s s,该字符串仅由英文字母表中的小写字母组成,表示蚱蜢 Marko 想要打出的字符串。

输出格式

第一行也是唯一一行,输出可以打印出蚱蜢 Marko 所想要的字符串需要按的键序列。

样例 #1

样例输入 #1

2 3 4 5 6 7 8 9 1
klor

样例输出 #1

44#444555666

样例 #2

样例输入 #2

7 8 9 1 2 3 6 5 4
djevojka

样例输出 #2

68662227778#885

样例 #3

样例输入 #3

9 8 7 6 5 4 3 2 1
skakavac

样例输出 #3

33335585582228#888

提示

样例 1 说明

所有键的功能都向右移动一个位置,因此输出与题目中的示例语句中的示例略有不同。

数据规模与约定

∣ s ∣ |s| s 为字符串 s s s 的长度,则对于 100 % 100\% 100% 的数据,都有 1 ≤ ∣ s ∣ ≤ 100 1\le |s|\le 100 1s100

说明

题目译自 COCI2014-2015 CONTEST #2 T1 MOBITEL

C++实现

#include<bits/stdc++.h>
using namespace std;
int a[10];
string s;
int lst;
int c[27]=
{0,2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7,7,8,8,8,9,9,9,9};
int sum[27]=
{0,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,4,1,2,3,1,2,3,4};
void init(){
for(int i=1;i<=9;i++){
int x;cin>>x;
a[x]=i;
}
cin>>s;
}
int main(){
init();
for(int i=0;i<s.size();i++){
int num=s[i]-‘a’+1;
if(lst==c[num])cout<<‘#’;
lst=c[num];
for(int j=1;j<=sum[num];j++)
cout<<a[c[num]];
}
return 0;
}

在这里插入图片描述

后续

接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

Logo

2万人民币佣金等你来拿,中德社区发起者X.Lab,联合德国优秀企业对接开发项目,领取项目得佣金!!!

更多推荐