题意翻译
输入每个字母的 Morse编码(字母代码表)。对于每个编码,判断它可能是哪个单词。如果有多个单词精确匹配,输出第一个匹配的单词并且后面加上"!";如果 无法精确匹配,可以在编码尾部增加或删除一些字符以后匹配某个单词(增加或删除的字符应尽量少)。如果只能非精确匹配,任选一个可能的匹配单词,后面加上"?"。
感谢@BFD_qt 提供的翻译
输入输出样例
输入 #1复制
A
.-
B
-…
C
-.-.
D
-…
E
.
F
…-.
G
–.
H
…
I
…
J
.—
K
-.-
L
.-…
M
N
-.
O
P
.–.
Q
–.-
R
.-.
S
…
T
U
…-
V
…-
W
.–
X
-…-
Y
-.–
Z
–…
0
1
.-----
2
…—
3
…–
4
…-
5
…
6
-…
7
–…
8
—…
9
----.
*
AN
EARTHQUAKE
EAT
GOD
HATH
IM
READY
TO
WHAT
WROTH
*
.–…-- …–…
–.----… .–.-.----…
.–…-- .–.
…-.-.-…–.-…-.–.-.
…-- .-…–…-.–
…–
*
输出 #1复制
WHAT
HATH
GOD
WROTH?
WHAT
AN
EARTHQUAKE
EAT!
READY
TO
EAT!
/*
一看这题 这啥呀 根本懵逼了,然后跑去看题解,还啥玩意模糊暴力!!
两个map 若有读者,自行理会吧
*/
#include<iostream>
#include<cstdio>
#include<map>
#include<cstring>
using namespace std;
const int INF = 0x3f3f3f;
map<char,string> morse;
map<string,string> dic;
int Judge(string a,string b) {
if(a == b) return 0;
if(a.size() > b.size()) swap(a,b);
if(a == b.substr(0, a.size())) return b.size() - a.size();
return INF;
}
string solve(const string &s) {
string ans = "";
int Min = INF;
for(map<string,string>:: iterator it = dic.begin(); it != dic.end(); ++it) {
int d = Judge(s, it->second);
if(!d && !Min && *ans.rbegin() != '!') { ans += "!"; return ans; }
else if(d <= Min) ans = it->first;
Min = min(Min,d);
}
if(Min) ans += "?";
return ans;
}
int main() {
string s,ch;
while(cin >> ch && ch != "*") {
cin >> s;
morse[ch[0]] = s;
}
while(cin >> s && s != "*") {
for(int i=0; i<s.size(); i++)
dic[s] += morse[s[i]];
}
while(cin >> s && s != "*")
cout << solve(s) << endl;
return 0;
}