uva 508 - Morse Mismatches(摩斯码)
来自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!
解释一下阅读题:输入:
先输入字符与摩斯码的对应,以 * 结束 ,
再输入字典(字典的意思就是你解密的词语只能从这里选取),以 * 结束,
在输入需要解密的摩斯码 ,以 * 结束。
几个注意点:
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(摩斯码)的更多相关文章
- UVA 508 Morse Mismatches JAVA
题意:输入字母和数字的编码,输入词典,输入一段编码,求出对应的单词. 思路:来自https://blog.csdn.net/qq_41163933/article/details/82224703 i ...
- uva 508 Morse Mismatches
Samuel F. B. Morse is best known for the coding scheme that carries his name. Morse code is still us ...
- UVa 508 Morse Mismatches (模糊暴力)
题意:莫尔斯电码,输入若干个字母的Morse编号,一个字典和若干编码.对于每个编号,判断它可能的是哪个单词, 如果有多个单词精确匹配,输出第一个单词并加一个“!”:如果无法精确匹配,那么在编码尾部增加 ...
- [LeetCode] Unique Morse Code Words 独特的摩斯码单词
International Morse Code defines a standard encoding where each letter is mapped to a series of dots ...
- [LeetCode] 804. Unique Morse Code Words 独特的摩斯码单词
International Morse Code defines a standard encoding where each letter is mapped to a series of dots ...
- Javascript实现摩斯码加密解密
原文地址 作者:liaoyu 摩尔斯电码是一种时通时断的信号代码,通过不同的排列顺序来表达不同的英文字母.数字和标点符号,是由美国人萨缪尔·摩尔斯在1836年发明. 每一个字符(字母或数字)对应不同的 ...
- python-摩斯码转换
意义:简单实现摩斯码的破译和生成 代码: #-*- coding: UTF-8 -*- ' __date__ = '2016/2/2' import pprint import re chars = ...
- [刷题]算法竞赛入门经典(第2版) 4-6/UVa508 - Morse Mismatches
书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,10 ms) //UVa508 - Morse Mismatches #include< ...
- python实现的摩斯电码解码\编码器
代码地址如下:http://www.demodashi.com/demo/14743.html 详细说明: 现在这年头谍战片.警匪片动不动就用摩斯密码来传递信息,一方面可以用来耍帅,另外一方面好像不插 ...
随机推荐
- Linux--VSFTP服务搭建
Vsftp服务 服务功能:文件传输 1.环境部署 ip=192.168.1.50 [root@localhost /]# rpm -ivh /mnt/Packages/vsftpd-2.2.2-11. ...
- C/C++ 修改控制台程序文字颜色
可以修改前景色(字体颜色)和背景色. 示例代码如下: #include <iostream> #include <Windows.h> //需要引用Windows.h usin ...
- 利用Docker volume修改Nginx Docker镜像里index.html
通过这个小例子我们可以进一步加深对Docker volume概念的理解和使用方法. 我们都知道运行基于Docker的Nginx镜像后,访问localhost能看到Nginx默认的首页,这个首页的位置是 ...
- jQuery的datatable的destroy属性,和$("#test").dataTable().fnDestroy();区别,两者的区别
jQuery的datatable的destroy属性,和$("#test").dataTable().fnDestroy();区别,两者的区别. 1 destroy属性是,销毁实例 ...
- Linux 安装ngnix
第一步:把nginx的源码包上传到linux系统/home 第二步:解压缩 [root@localhost ~]# tar zxf nginx-1.8.0.tar.gz 第三步:使用configure ...
- 宠物商城后台管理系统(springMVC+Mybatis+数据库)
mysql数据库 create database swager; use swager; #类别 create table Category( id int primary key auto_incr ...
- 【luogu P4114 Qtree1】 题解
题目链接:https://www.luogu.org/problemnew/show/P4114 1.把边权转化到点权:选取连接这条边的两个点中较深的一个. 2.查询点到点之间的边权时,要从seg[x ...
- 【luogu P4137 Rmq Problem / mex】 题解
题目链接:https://www.luogu.org/problemnew/show/P4137 求区间内最大没出现过的自然数 在add时要先判断会不会对当前答案产生影响,如果有就去找下一个答案. # ...
- Notepad++ 插件之 TextFX (安装及作用)
<安装:打开 notepad++ 插件 -> Plugin Manager -> Show Plugin Manager -> available ->选中 TextF ...
- 我和我的广告前端代码(四):后台系统中,初尝vue、vue-cli
有一段都在重构之前文章<我和我的广告前端代码(三):一次重来的机会,必要的技术选型>中提到的广告前台展示项目,原有的基于页面的请求,改成了单广告位请求在这个过程中经历了好几次架构变更以及项 ...