来自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. asyncio标准库1 Hello World

    利用asyncio的event loop,编写和调度协程 coroutine [,kəuru:'ti:n] n. 协程 Simple coroutine(调用1个协程) import asyncio ...

  2. Flume的load-balance、failover

    配置flume集群参考https://www.cnblogs.com/jifengblog/p/9277793.html load-balance负载均衡 介绍 负载均衡是用于解决一台机器(一个进程) ...

  3. SONA Topology

    N多年以前就有有人设计传了一种类似“房子”状结构的拓扑图,在Cisco的文档中可以查到这种叫SONA.这是个非常神奇的设计,适合用于中小型网络,之所以这么讲,是因为在这个结构下,但凡任何一台接入层或者 ...

  4. 如何从ERP下载Sales BOM到CRM

    在ERP使用事务码CS01创建一个BOM,类型选择5 - Sales BOM: BOM的抬头维护material 1419,在BOM的component部分维护另外两个material 1421和14 ...

  5. Jmeter入门10 jmeter加密串处理方式2:BeanShell PreProcessor

    上一个博客讲了方式一:函数助手__digest加密,BeanShell PreProcessor也可以用java代码进行处理 线程组.参数.请求都直接使用上一个博客的. 第一步 添加BeanShell ...

  6. IOS 应用管理(九宫格) 总结笔记

    1. 开发前的思路 ========================================1> 从mainBundle中加载Plist2> 按照plist中的数据数量先确定各个a ...

  7. 每日linux命令之kill

    1.命令格式: kill[参数][进程号] 2.命令功能: 发送指定的信号到相应进程.不指定型号将发送SIGTERM(15)终止指定进程.如果任无法终止该程序可用“-KILL” 参数,其发送的信号为S ...

  8. ZJOI2019Day1镇海中学游记(3.24~3.27)

    前言 第一次正式参加省选!不管怎么说,虽然明知自己很弱,但还是要尽力去尝试吧! 最好能进前\(100\),不然就没法去\(Day2\)了. \(Mar\ 24th\):出发 今天,我们正式从二中向宁波 ...

  9. 【转】 Android Fragment 真正的完全解析(下)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37992017 上篇博客中已经介绍了Fragment产生原因,以及一些基本的用法和 ...

  10. WebNotes(PHP、css、JavaScript等)

    1. 数据库编码格式 gb-2312仅支持简体中文,GBK支持简体.繁体中文,utf-8通用程度最高. 2. HTTP请求方法 get方法请求时,会将传输的数据跟在链接后“显式地”发送,受限于链接长度 ...