uva 508 Morse Mismatches
Samuel F. B. Morse is best known for the coding scheme that carries his name. Morse code is still used in international radio communication. The coding of text using Morse code is straightforward. Each character (case is insignificant) is translated to a predefined sequence of dits and dahs (the elements of Morse code). Dits are represented as periods (``.'') and dahs are represented as hyphens or minus signs (``-''). Each element is transmitted by sending a signal for some period of time. A dit is rather short, and a dah is, in perfectly formed code, three times as long as a dit. A short silent space appears between elements, with a longer space between characters. A still longer space separates words. This dependence on the spacing and timing of elements means that Morse code operators sometimes do not send perfect code. This results in difficulties for the receiving operator, but frequently the message can be decoded depending on context.
In this problem we consider reception of words in Morse code without spacing between letters. Without the spacing, it is possible for multiple words to be coded the same. For example, if the message ``dit dit dit'' were received, it could be interpreted as ``EEE'', ``EI'', ``IE'' or ``S'' based on the coding scheme shown in the sample input. To decide between these multiple interpretations, we assume a particular context by expecting each received word to appear in a dictionary.
For this problem your program will read a table giving the encoding of letters and digits into Morse code, a list of expected words (context), and a sequence of words encoded in Morse code (morse). These morse words may be flawed. For each morse word, your program is to determine the matching word from context, if any. If multiple words from context match morse, or if no word matches perfectly, your program will display the best matching word and a mismatch indicator.
If a single word from context matches morse perfectly, it will be displayed on a single line, by itself. If multiple context words exist for a given morse, the first matching word will be displayed followed by an exclamation point (``!'').
We assume only a simple case of errors in transmission in which elements may be either truncated from the end of a morse word or added to the end of a morse word. When no perfect matches for morse are found, display the word from context that matches the longest prefix of morse, or has the fewest extra elements beyond those in morse. If multiple words in context match using these rules, any of these matches may be displayed. Words that do not match perfectly are displayed with a question mark (``?'') suffixed.
The input data will only contain cases that fall within the preceding rules.
Input
The Morse code table will appear first and consists of lines each containing an uppercase letter or a digit C, zero or more blanks, and a sequence of no more than six periods and hyphens giving the Morse code for C. Blanks may precede or follow the items on the line. A line containing a single asterisk (``*''), possibly preceded or followed by blanks, terminates the Morse code table. You may assume that there will be Morse code given for every character that appears in the context section.
The context section appears next, with one word per line, possibly preceded and followed by blanks. Each word in context will contain no more than ten characters. No characters other than upper case letters and digits will appear. Thered will be at most 100 context words. A line containing only a single asterisk (``*''), possibly preceded or followed by blanks, terminates the context section.
The remainder of the input contains morse words separated by blanks or end-of-line characters. A line containing only a single asterisk (``*''), possibly preceded or followed by blanks, terminates the input. No morse word will have more than eighty (80) elements.
Output
For each input morse word, display the appropriate matching word from context followed by an exclamation mark (``!'') or question mark (``?'') if appropriate. Each word is to appear on a separate line starting in column one.
Sample Input
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
*
.--.....--
.....--....
--.----..
.--.-.----..
.--.....--
.--.
..-.-.-....--.-..-.--.-.
..--
.-...--..-.--
----
..--
*
Sample output
WHAT
HATH
GOD
WROTH?
WHAT
AN
EARTHQUAKE
EAT!
READY
TO
EAT! 给定一些已知字典,给定一些编码,求解这些编码的对应原文,如果可以精确匹配,则直接输出原单词,
如果有多个可精确匹配的结果,则输出匹配结果里字典序最小的单词并在末位加上“!”;
如果无法精确匹配,则可以在编码的末尾增加或删除一些字符后匹配单词(增删量最小),无论增删后匹配一个还是多个,最后都要加上“?”;
如果有多个模糊匹配结果(增删数相等),则输出字典序最小的匹配结果;
如果无精确匹配也无模糊匹配结果,则输出整个给定字典里字典序最小的那个单词。 看清题意就好,用map做,不难!
#include <iostream>
#include <map>
#include <cmath>
#include <string>
#include <algorithm>
using namespace std; map <char, string>morse;
string words[],codes[];
int n;
map<char,string>::iterator t; string change(string word)
{
char code[];
int wordsize = word.length(),p = ; for(int i = ;i < wordsize; i++){ for(t = morse.begin();t != morse.end();t++){ if((*t).first == word[i]){
int morsesize = ((*t).second).length();
for(int j = ;j < morsesize;j++ )code[p++] = ((*t).second)[j];
break;
}
}
}
code[p] = '\0';
return code;
} void detail(string co)
{
int p = co.length(),a,b=,c;
bool flag;
for(int i = ;i < n;i++){
int q = codes[i].length();
flag = true;
if(q > p){
for(int j = ;j < p;j++){
if(co[j] != codes[i][j]){
flag = false;
break;
}
}
}
else{
for(int j = ;j < q;j++){
if(co[j] != codes[i][j]){
flag = false;
break;
}
}
}
if(flag){
a = abs(q - p);
c = i;
}
if(flag && a < b){
b = a;
c = i;
}
}
cout << words[c] << "?" <<endl;
} void deal(string co)
{
int m = ;
for(int i = ;i < n;i++){
if(co == codes[i]){
if(m == )cout << words[i];
m++;
}
}
if(m == )cout << endl;
else if(m > ) cout << "!" << endl;
else if(m == )detail(co);
} int main()
{
char ch; while(cin >> ch){ //单词对应的编码
if(ch == '*')break;
string mima;
cin >> mima;
morse[ch] = mima;
} for(int i = ; ; i++){ //字典中的单词
cin >> words[i];
if(words[i][] == '*'){
n = i;
break;
}
}
sort(words , words + n); //字典序从小到大排列
for(int i = ;i < n;i++){
//cout<<"-**-"<<words[i]<<endl;
codes[i] = change( words[i] );
} string co;
while(cin >> co){
if(co[] == '*')break;
deal(co);
} //system("pause");
return ;
}
提交以上代码....发现 还是结果错误
有两个小错误,通过以下测试得出的
1.
S ...
O ---
T -
*
SO
ST
*
...--
得到的结果是ST 而正确答案是SO 经检查发现detail函数中第一个flag只判断第一次true的情况,所以加上条件cot即可
2.
S ...
O ---
T -
V ...-
I ..
A .-
*
SO
IAT
*
...---.
得到的结果是IAT 而正确答案是SO 经检查发现detail函数中给a赋值不是只在第一次flag判断中赋值,所有情况为都要给a赋值,由于上一部加上cot条件导致这一步出错所以将a的赋值语句移至flag为true情况外即可
AC代码
#include <iostream>
#include <map>
#include <cmath>
#include <string>
#include <algorithm>
using namespace std; map <char, string>morse;
string words[],codes[];
int n;
map<char,string>::iterator t; string change(string word)
{
char code[];
int wordsize = word.length(),p = ; for(int i = ;i < wordsize; i++){ for(t = morse.begin();t != morse.end();t++){ if((*t).first == word[i]){
int morsesize = ((*t).second).length();
for(int j = ;j < morsesize;j++ )code[p++] = ((*t).second)[j];
break;
}
}
}
code[p] = '\0';
return code;
} void detail(string co)
{
int p = co.length(),a,b=,c,cot=; //q为待检测电码长度
bool flag;
for(int i = ;i < n;i++){
int q = codes[i].length(); //p为原单词电码的长度
//cout<<words[i]<<" "<<codes[i]<<" "<<q<<endl;
flag = true;
if(q > p){
for(int j = ;j < p;j++){
if(co[j] != codes[i][j]){
flag = false;
break;
}
}
}
else{
for(int j = ;j < q;j++){
if(co[j] != codes[i][j]){
flag = false;
break;
}
}
}
a = abs(q - p);
if(flag && cot){
c = i;
cot = ;
//cout<<"aa "<<a<<" "<<c<<endl;
}
if(flag && a < b){
b = a;
c = i;
}
}
cout << words[c] << "?" <<endl;
} void deal(string co)
{
int m = ;
for(int i = ;i < n;i++){
if(co == codes[i]){
if(m == )cout << words[i];
m++;
}
}
if(m == )cout << endl;
else if(m > ) cout << "!" << endl;
else if(m == )detail(co);
} int main()
{
char ch; while(cin >> ch){ //单词对应的编码
if(ch == '*')break;
string mima;
cin >> mima;
morse[ch] = mima;
} for(int i = ; ; i++){ //字典中的单词
cin >> words[i];
if(words[i][] == '*'){
n = i;
break;
}
}
sort(words , words + n); //字典序从小到大排列 for(int i = ;i < n;i++){
codes[i] = change( words[i] );
/*cout<<"words "<<words[i]<<endl;
cout<<"codes "<<codes[i]<<endl;*/
} string co;
while(cin >> co){
if(co[] == '*')break;
deal(co);
} //system("pause");
return ;
}
uva 508 Morse Mismatches的更多相关文章
- uva 508 - Morse Mismatches(摩斯码)
来自https://blog.csdn.net/su_cicada/article/details/80084529 习题4-6 莫尔斯电码(Morse Mismatches, ACM/ICPC Wo ...
- UVA 508 Morse Mismatches JAVA
题意:输入字母和数字的编码,输入词典,输入一段编码,求出对应的单词. 思路:来自https://blog.csdn.net/qq_41163933/article/details/82224703 i ...
- UVa 508 Morse Mismatches (模糊暴力)
题意:莫尔斯电码,输入若干个字母的Morse编号,一个字典和若干编码.对于每个编号,判断它可能的是哪个单词, 如果有多个单词精确匹配,输出第一个单词并加一个“!”:如果无法精确匹配,那么在编码尾部增加 ...
- [刷题]算法竞赛入门经典(第2版) 4-6/UVa508 - Morse Mismatches
书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,10 ms) //UVa508 - Morse Mismatches #include< ...
- 【习题 4-6 UVA - 508】Morse Mismatches
[链接] 我是链接,点我呀:) [题意] 给你每个字母对应的摩斯密码. 然后每个单词的莫斯密码由其组成字母的莫斯密码连接而成. 现在给你若干个莫斯密码. 请问你每个莫斯密码对应哪个单词. 如果有多个单 ...
- UVA 567 Risk【floyd】
题目链接: option=com_onlinejudge&Itemid=8&page=show_problem&problem=508">https://uva ...
- uva 1354 Mobile Computing ——yhx
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABGcAAANuCAYAAAC7f2QuAAAgAElEQVR4nOy9XUhjWbo3vu72RRgkF5
- UVA 10564 Paths through the Hourglass[DP 打印]
UVA - 10564 Paths through the Hourglass 题意: 要求从第一层走到最下面一层,只能往左下或右下走 问有多少条路径之和刚好等于S? 如果有的话,输出字典序最小的路径 ...
- UVA 11404 Palindromic Subsequence[DP LCS 打印]
UVA - 11404 Palindromic Subsequence 题意:一个字符串,删去0个或多个字符,输出字典序最小且最长的回文字符串 不要求路径区间DP都可以做 然而要字典序最小 倒过来求L ...
随机推荐
- 虚拟机安装centos
linux安装 鉴于国内大多数服务器都使用的redhat系列作为操作系统,centos又是redhat的免费版本,所以可以学习一下.因为另一台古董电脑已经装了linuxmint,虽然也可以安装虚拟机, ...
- encodeURI后台乱码(解决)
window.location.href = xxxx?a=encodeURI(encodeURI(name)) ; name是中文,页面部分需要编码两次 name = java.net.URLDec ...
- NAS4Free 安装配置(三)基本配置
基本配置 在浏览器中输入地址,进入管理界面(我的是http://192.168.0.10) 登录界面 初始用户名:admin,初始密码:nas4free 首页 进入基本配置 这里可以选择语言,有中文, ...
- MVC请求过程 简单分析(一)
在服务端判断客户端传过来的文件的类型,如果是静态文件,直接返回,在页面输出显示.如果是动态文件,通过aspnet_isapi.dll转交过.NetFrameWork框架执行. 创建ISAPIrunti ...
- js 浮点数加减问题
/** ** 加法函数,用来得到精确的加法结果 ** 说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显.这个函数返回较为精确的加法结果. ** 调用:accAd ...
- 在Fedora 20下编译安装QEMU
由于OpenStack的流行,现在越来越多的人关注QEMU,最近发行了新版本1.7,下面就说Fedora下的安装过程: 首先需要安装基本的编译软件和git sudo yum install gcc m ...
- VS2010中<无法打开包括文件:“iostream.h”:>错误解决方法
C/C++ code? 1 2 #include <iostream.h> 改为: C/C++ code? 1 2 #include <iostream> using name ...
- 执行yiic webapp命令时报错:php.exe不是内部或外部命令,也不是可运行的程序
在执行 yiic webapp ../abc 命令时报错: “php.exe”不是内部或外部命令,也不是可运行的程序 或批处理文件. 这是因为yiic批处理程序找不到php.exe的执行路径引起的. ...
- BZOJ 1017 魔兽地图DotR(树形DP)
题意:有两类装备,高级装备A和基础装备B.现在有m的钱.每种B有一个单价和可以购买的数量上限.每个Ai可以由Ci种其他物品合成,给出Ci种其他物品每种需要的数量.每个装备有一个贡献值.求最大的贡献值. ...
- 单片机C 语言与汇编语言混合编程
在单片机应用系统设计中,过去主要采用汇编语言开发程序. 汇编语言编写的程序对单片机硬件操作很方便,编写的程序代码短,效率高,但系统设计的周期长,可读性和可移植性都很差.C语言程序开发是近年来单片机系统 ...