第三十七题 UVA508 摩尔斯密码 Morse Mismatches

PDF

题意翻译
输入每个字母的 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;
}
发布了732 篇原创文章 · 获赞 31 · 访问量 17万+

猜你喜欢

转载自blog.csdn.net/qq_35776409/article/details/103963837