来自https://blog.csdn.net/su_cicada/article/details/80084529

习题4-6 莫尔斯电码(Morse Mismatches, ACM/ICPC World Finals 1997, UVa508)

输入每个字母的Morse编码,一个词典以及若干个编码。对于每个编码,判断它可能是

哪个单词。如果有多个单词精确匹配,选取字典序第一个再加上“!”;如果无法精确匹

配,可以在编码尾部增加或删除一些字符以后匹配某个单词(增加或删除的字符应尽量少)。如果有多个单词可以这样匹配上,选取字典序第一个输出并且在后面加上“?”。



提供一个样例

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!

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=833&problem=449&mosmsg=Submission+received+with+ID+21190426

解释一下阅读题:输入:

先输入字符与摩斯码的对应,以 * 结束 ,

再输入字典(字典的意思就是你解密的词语只能从这里选取),以 * 结束,

在输入需要解密的摩斯码 ,以 * 结束。

几个注意点:

1、经过多方求证,第二个输入的字典,需要以字典序排列好,这样在查找词组时才能按照字典序查找。

2、刘汝佳书中写的书错的,不是任意选取一个输出,是按照字典序选取

3、udebug中有一个样例输出结果有问题

4、只要是模糊匹配,就加上 ? ,无论匹配到几个合适的

思路:

1、使用两个map映射,或者四个两对vector,来分别存储‘真实字符’和‘每个真实字符的摩斯码’,‘字典里的每个词组’和‘字典里每个词组对应的摩斯码’(这个需要经过加密运算后进行存储)

(因为是要存的数组中每个元素都是字符串型,所以我选取了vector string>来进行存储)

(可以使用map来进行存储,而且map默认字典序存储)

2、一个函数加密,一个函数解密,通过遍历边比来进行比对出模糊匹配中最小的增删字符长度

附赠样例对照表一份

/*
AN .--.
EARTHQUAKE ..-.-.-....--.-..-.--.-.
EAT ..--
GOD --.----..
HATH .....--....
IM ..--
READY .-...--..-.--
TO ----
WHAT .--.....--
WROTH .--.-.----....
*/
//在匹配到的中,应选择字符最少的词组
//比如:A . B - C.- 那么.-xx就应该是C
#include<iostream>
#include<string>
#include<vector>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std; char word[50]; //存真实字符
vector<string> morse; //存字符的摩斯码
vector<string> dict; //存词组的字典
vector<string> puzzle; //存字典对应的摩斯码
vector<string> question; //存要解的摩斯码 string zip(string str) //词组加密成摩斯码
{
string ans;
for(int i=0;i<str.size();i++)
{
for(int j=0;j<26+10;j++)
{
if(str[i]==word[j])
{
ans = ans +morse[j];
break;
}
}
}
return ans;
} string solove(string mos) //从摩斯解密为词组
{
int jingzhun_n=-1,jingzhun=0; //精准匹配的下标,个数
int mohu_n=-1,mohu=0,mohu_len=999; //模糊匹配的下标,个数,模糊字符长度
int yes;//匹配位数
int length=mos.size();
int puzz_len; //遍历中的词组的长度 for(int i=0;i<puzzle.size();i++) //遍历所有的词语
{
puzz_len=puzzle[i].size();
yes =0; //匹配的字符数量
//cout<<length<<" "<<puzz_len<<endl;
for(int j=0;j<puzz_len&&j<length;j++) //遍历每个词语摩斯码的每一位
{
if(mos[j]==puzzle[i].at(j))
{
yes++;
//cout<<yes<<"||||"<<endl;
}
else
break;
}//for(j
if(yes==puzz_len&&length==puzz_len) //精准匹配
{
if(jingzhun<1)
jingzhun_n=i;
jingzhun++;
}
else if(yes==puzz_len&&length>yes|| //模糊匹配,mose长
yes<puzz_len&&yes==length) //当前词组长
{
if(mohu_len>abs(puzz_len-length))
{
mohu_len= abs(puzz_len-length);
// cout<<"\||||"<<endl<<mohu<<" "<<dict[mohu_n]<<endl<<endl;
mohu_n= i;
mohu++;
}
}
}//for(i if(jingzhun>0)
{
if(jingzhun>1)
return dict[jingzhun_n]+"!";
return dict[jingzhun_n];
}
else if(mohu>0)
{
return dict[mohu_n]+"?";
}
else
return dict[0];
}
int main()
{
//输入字符和对应的摩斯码
for(int i=0;;i++)
{
string temp;
char c;
cin>>c;
if(c=='*')
break;
word[i]=c;
cin>>temp;
morse.push_back(temp);
} //输入词组的字典
string temp;
while(cin>>temp&&temp!="*")
{
dict.push_back(temp);
}
sort(dict.begin(),dict.end()); //输入要解密的摩斯码
while(cin>>temp&&temp!="*")
{
question.push_back(temp);
} //输入结束 //计算加密后的字典中的词组
for(int i=0;i<dict.size();i++)
{
string temp2 =zip(dict[i]);
puzzle.push_back(temp2);
} //开始解密
for(int i=0;i<question.size();i++)
{
//cout<<question[i]<<"????"<<endl;
cout<<solove(question[i])<<endl;
} // cout<<dict.size()<<" "<<puzzle.size()<<endl;
// for(int i=0;i<puzzle.size();i++)
// {
// cout<<dict[i]<<" ";
// cout<<puzzle[i]<<endl;
// }
return 0;
}
//AC at 2018/4/23

(题外话:解出题目的时候是很高兴的,写出程序是很高兴的,不能写程序的话我就要死了,这道题我早上开始做,不知不觉占用了所有的空闲时间,导致别人分配给我的任务都没有做,我真的是。)

uva 508 - Morse Mismatches(摩斯码)的更多相关文章

  1. UVA 508 Morse Mismatches JAVA

    题意:输入字母和数字的编码,输入词典,输入一段编码,求出对应的单词. 思路:来自https://blog.csdn.net/qq_41163933/article/details/82224703 i ...

  2. uva 508 Morse Mismatches

    Samuel F. B. Morse is best known for the coding scheme that carries his name. Morse code is still us ...

  3. UVa 508 Morse Mismatches (模糊暴力)

    题意:莫尔斯电码,输入若干个字母的Morse编号,一个字典和若干编码.对于每个编号,判断它可能的是哪个单词, 如果有多个单词精确匹配,输出第一个单词并加一个“!”:如果无法精确匹配,那么在编码尾部增加 ...

  4. [LeetCode] Unique Morse Code Words 独特的摩斯码单词

    International Morse Code defines a standard encoding where each letter is mapped to a series of dots ...

  5. [LeetCode] 804. Unique Morse Code Words 独特的摩斯码单词

    International Morse Code defines a standard encoding where each letter is mapped to a series of dots ...

  6. Javascript实现摩斯码加密解密

    原文地址 作者:liaoyu 摩尔斯电码是一种时通时断的信号代码,通过不同的排列顺序来表达不同的英文字母.数字和标点符号,是由美国人萨缪尔·摩尔斯在1836年发明. 每一个字符(字母或数字)对应不同的 ...

  7. python-摩斯码转换

    意义:简单实现摩斯码的破译和生成 代码: #-*- coding: UTF-8 -*- ' __date__ = '2016/2/2' import pprint import re chars = ...

  8. [刷题]算法竞赛入门经典(第2版) 4-6/UVa508 - Morse Mismatches

    书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,10 ms) //UVa508 - Morse Mismatches #include< ...

  9. python实现的摩斯电码解码\编码器

    代码地址如下:http://www.demodashi.com/demo/14743.html 详细说明: 现在这年头谍战片.警匪片动不动就用摩斯密码来传递信息,一方面可以用来耍帅,另外一方面好像不插 ...

随机推荐

  1. 狂欢圣诞节,Azure云邀你一起云端跑酷!

    想要速度更快? 希望绕过障碍? 还想安全抵达目的地? …… 平安夜夜游时的各种畅想,不也正是 IT 同事所追求的,更是业务发展的终极目标呀. 好啦,小编说的太多了,这样不好不好.过节休息不谈工作,那就 ...

  2. SQL获取本周,上周,本月,上月的开始时间和结束时间

    ),),--本周 ),),--上周 ),),--本月 ),),--上月 ),),--近半年 ),)--近一年 ), ,, ),)--本周开始时间 ), ,, ),)--本周结束时间 ),,, ),)- ...

  3. Spring中<context:annotation-config/>的作用

    spring中<context:annotation-config/>配置的作用,现记录如下: <context:annotation-config/>的作用是向Spring容 ...

  4. SAP成都研究院许聚龙:Hello, Coresystems!

    Jerry的前一篇文章<SAP成都研究院数字创新空间沟通S/4HANA和C/4HANA的智能服务演示视频和Coresystems分享预告>已经提到,接下来会由SAP成都研究院数字创新空间的 ...

  5. bzoj2111 [ZJOI2010]排列计数

    Description 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Magic ...

  6. softmax实现cifar10分类

    将cifar10改成单一通道后,套用前面的softmax分类,分类率40%左右,想哭... .caret, .dropup > .btn > .caret { border-top-col ...

  7. 【bzoj2563】 阿狸和桃子的游戏

    题目 非常妙的题目,一看到就以为是一道博弈,之后就不会做了 正解非常巧妙,由于我们只需要求出最后两个人得分的差值,所以对于每一条边我们将其的权值拆成两边,分给其连接的两个点 如果这两个点被同一个人选择 ...

  8. Codeforces Round #521 (Div. 3) D. Cutting Out 【二分+排序】

    任意门:http://codeforces.com/contest/1077/problem/D D. Cutting Out time limit per test 3 seconds memory ...

  9. Oracle文本导入器

    将文本格式化为Tab分隔的数据行,可以用Excel搞定 如果新增列需要从前面的列获取数据,比如用身份证号计算年龄 需要保证新增列在导入的文件中实际存在列,否则无法使用相对位置和绝对位置进行取值 相对位 ...

  10. linux dentry cache 转自:http://blog.csdn.net/denzilxu/article/details/9188003

    Linux dentry cache学习 每个dentry对象都属于下列几种状态之一: (1)未使用(unused)状态:该dentry对象的引用计数d_count的值为0,但其d_inode指针仍然 ...