1547. 约会
原题传送:AcWing 1547. 约会
大侦探福尔摩斯接到一张奇怪的字条:
我们约会吧!3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm
。
大侦探很快就明白了,字条上奇怪的乱码实际上就是约会的时间 星期四14:04
,因为前面两字符串中第
1
1
1 对相同的大写英文字母(大小写有区分)是第
4
4
4个字母D,代表星期四;第
2
2
2 对相同的字符是
E
E
E,那是第
5
5
5 个英文字母,代表一天里的第
14
14
14 个钟头(于是一天的
0
0
0 点到
23
23
23 点由数字
0
0
0 到
9
9
9、以及大写字母
A
A
A 到
N
N
N 表示);后面两字符串第
1
1
1 对相同的英文字母
s
s
s 出现在第
4
4
4 个位置(从
0
0
0 开始计数)上,代表第
4
4
4 分钟。
现给定两对字符串,请帮助福尔摩斯解码得到约会的时间。
补充
1、一对字符相同,是指在两个字符相同且在字符串的位置也相同。
2、前两个字符串中第一对相同的大写英文字母,是指第一对能够 正确代表日期 的大写英文字母。
3、前两个字符串中第二对相同的字符,是指位于 代表日期的字符后面 的,第一对 相同的,能够 正确代表小时 的字符。
输入格式
输入在 4 4 4行中分别给出 4 4 4个非空、不包含空格、且长度不超过 60 60 60的字符串。
输出格式
在一行中输出约会的时间,格式为 DAYHH:MM
,其中DAY
是某星期的
3
3
3 字符缩写,即 MON
表示星期一,TUE
表示星期二,WED
表示星期三,THU
表示星期四,FRI
表示星期五,SAT
表示星期六,SUN
表示星期日。
题目输入保证每个测试存在唯一解。
输入样例:
3485djDkxh4hhGE
2984akDfkkkkggEdsb
s&hgsfdk
d&Hyscvnm
输出样例:
THU 14:04
思路
先比较前两个字符串,得出日期和小时,再比较后两个字符串得出分钟,注意题目中给出的每个对应字符的范围。
题解
#include <bits/stdc++.h>
using namespace std;
int flag = 0;
string s1, s2, t1, t2;
string week_dict[7] = {"MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"};
bool isday(char c)
{
return 'A' <= c and c <= 'G';
}
bool isvalid(char c)
{
return 'A' <= c and c <= 'N';
}
int main()
{
getline(cin, s1);
getline(cin, s2);
getline(cin, t1);
getline(cin, t2);
for(int i = 0; i < min(s1.length(), s2.length()); i++)
{
if(!flag && isday(s1[i]) && isday(s2[i]) && s1[i] == s2[i])
{
cout << week_dict[s1[i]-'A'] << " ";
flag++;
}
else if(flag && isdigit(s1[i]) && isdigit(s2[i]) && s1[i] == s2[i])
{
cout << setw(2) << setfill('0') << s1[i]-'0';
break;
}
else if(flag && isvalid(s1[i]) && isvalid(s2[i]) && s1[i] == s2[i])
{
cout << setw(2) << setfill('0') << s1[i]-'A'+10;
break;
}
}
for(int i = 0; i < min(t1.length(), t2.length()); i++)
{
if(isalpha(t1[i]) && isalpha(t2[i]) && t1[i] == t2[i])
{
cout << ":" << setw(2) << setfill('0') << i;
break;
}
}
return 0;
}