POJ1051 P,MTHBGWB
题目来源:http://poj.org/problem?id=1051
题目大意:
Morse密码里每个字母用长度不定的点和线来表示,一条信息中字母的编码之间用空隙隔开。下表为Morse密码的编码表:
A | .- | H | .... | O | --- | V | ...- |
B | -... | I | .. | P | .--. | W | .-- |
C | -.-. | J | .--- | Q | --.- | X | -..- |
D | -.. | K | -.- | R | .-. | Y | -.-- |
E | . | L | .-.. | S | ... | Z | --.. |
F | ..-. | M | -- | T | - | ||
G | --. | N | -. | U | ..- |
在上面的基础上,我们加上下面几个编码(它们不属于实际的Morse编码):
下划线'_' : ..-- 句号'.' : ---.
逗号',' : .-.- 问号'?' : ----
于是信息"ACM_GREATER_NY_REGION"被编码为:
.- -.-. -- ..-- --. .-. . .- - . .-. ..-- -. -.-- ..-- .-. . --. .. --- -.
M.E. Ohaver 提出了一种基于以上Morse编码的加解密方式。标准的Morse码需要字母之间需要间隔,因为Morse码是可变长编码,而且不是prefix-free(这个词不知道怎么翻译,学过编译原理或者知道哈弗曼编码的都可以意会吧=。=)的。所以没有间隔的话会产生歧义,比如".--.-.--",如果不知道在哪里停顿,那么这条信息有可能为"ACM"、"ANK"以及别的一些词。但是,如果我们在编码中加入长度信息,即显式地指明每个字符的编码占几位,如".--.-.--242",就不会有歧义了。
Ohaver的加解密方式如下:
1. 把文本转换为Morse码,去掉Morse码中的空格,加上数字串表示每个字符所占的长度。
2. 把数字串翻转。
3. 再把翻转数字后的编码转换为文本。
加密和解密的方法一样。
比如"AKADTOF_IBOETATUK_IJN"先转为:
".--.-.--..----..-...--..-...---.-.--..--.-..--...----.232313442431121334242",
将数字翻转后为:
".--.-.--..----..-...--..-...---.-.--..--.-..--...----.242433121136266313232"。
最后再转为文本"ACM_GREATER_NY_REGION".
本题要求实现Ohaver的编码算法。
输入:一组由该算法编码的信息。第一行为整数n表示有多少个待转换的字符串。接下来的n行每行一个字符串,仅有26个大写字母,下划线,句号,逗号和问号组成。每条信息长度不超过100.
输出:对于每个输入,输出其编号和编码后的信息。
Sample Input
5
AKADTOF_IBOETATUK_IJN
PUEL
QEWOISE.EIVCAEFNRXTBELYTGD.
?EJHUT.TSMYGW?EJHOT
DSU.XFNCJEVE.OE_UJDXNO_YHU?VIDWDHPDJIKXZT?E
Sample Output
1: ACM_GREATER_NY_REGION
2: PERL
3: QUOTH_THE_RAVEN,_NEVERMORE.
4: TO_BE_OR_NOT_TO_BE?
5: THE_QUICK_BROWN_FOX_JUMPS_OVER_THE_LAZY_DOG
水题,看懂题目就没太大问题了。
//////////////////////////////////////////////////////////////////////////
// POJ1051 P,MTHBGWB
// Memory: 292K Time: 0MS
// Language: C++ Result: Accepted
////////////////////////////////////////////////////////////////////////// #include <iostream>
#include <string>
#include <map> using namespace std; map<char, string> dictionary; int main(void) {
int n;
cin >> n;
dictionary['A'] = ".-";
dictionary['B'] = "-...";
dictionary['C'] = "-.-.";
dictionary['D'] = "-..";
dictionary['E'] = ".";
dictionary['F'] = "..-.";
dictionary['G'] = "--.";
dictionary['H'] = "....";
dictionary['I'] = "..";
dictionary['J'] = ".---";
dictionary['K'] = "-.-";
dictionary['L'] = ".-..";
dictionary['M'] = "--";
dictionary['N'] = "-.";
dictionary['O'] = "---";
dictionary['P'] = ".--.";
dictionary['Q'] = "--.-";
dictionary['R'] = ".-.";
dictionary['S'] = "...";
dictionary['T'] = "-";
dictionary['U'] = "..-";
dictionary['V'] = "...-";
dictionary['W'] = ".--";
dictionary['X'] = "-..-";
dictionary['Y'] = "-.--";
dictionary['Z'] = "--..";
dictionary['_'] = "..--";
dictionary['.'] = "---.";
dictionary[','] = ".-.-";
dictionary['?'] = "----"; for (int case_id = ; case_id <= n; ++case_id) {
int len[];
int size;
string en_message;
string en_code;
string de_message;
cin >> en_message;
size = en_message.size();
for (size_t i = ; i < size; ++i) {
string code = dictionary[en_message[i]];
en_code += code;
len[i] = code.size();
}
int p = ;
for (int i = size - ; i >= ; --i) {
char code;
for (map<char, string>::iterator it = dictionary.begin(); it != dictionary.end(); ++it) {
if (it->second == en_code.substr(p, len[i])) {
code = it->first;
break;
}
}
de_message += code;
p += len[i];
}
cout << case_id << ": " << de_message << endl;
}
system("pause");
return ;
}
POJ1051 P,MTHBGWB的更多相关文章
- ZOJ 1068 P,MTHBGWB
原题链接 题目大意:给定一个字符串,先用Morse Code编码,把编码倒序,再解码成字符串.现给定处理后的字符串,求原始信息. 解法:用C++String类的函数.每次读入一个字符,就在string ...
- POJ题目排序的Java程序
POJ 排序的思想就是根据选取范围的题目的totalSubmittedNumber和totalAcceptedNumber计算一个avgAcceptRate. 每一道题都有一个value,value ...
- ACM训练计划建议(写给本校acmer,欢迎围观和指正)
ACM训练计划建议 From:freecode# Date:2015/5/20 前言: 老师要我们整理一份训练计划给下一届的学弟学妹们,整理出来了,费了不少笔墨,就也将它放到博客园上供大家参考. 菜 ...
- 【POJ水题完成表】
题目 完成情况 poj1000:A+B problem 完成 poj1002:电话上按键对应着数字.现在给n个电话,求排序.相同的归一类 完成 poj1003:求最小的n让1+1/2+1/3+...+ ...
- POJ题目细究
acm之pku题目分类 对ACM有兴趣的同学们可以看看 DP: 1011 NTA 简单题 1013 Great Equipment 简单题 102 ...
- 【转】POJ百道水题列表
以下是poj百道水题,新手可以考虑从这里刷起 搜索1002 Fire Net1004 Anagrams by Stack1005 Jugs1008 Gnome Tetravex1091 Knight ...
- ACM训练计划建议(转)
ACM训练计划建议 From:freecode# Date:2015/5/20 前言: 老师要我们整理一份训练计划给下一届的学弟学妹们,整理出来了,费了不少笔墨,就也将它放到博客园上供大家参考. 菜 ...
随机推荐
- C#数据导出到Excel源代码
最近工作中需要做一个把用户信息作为excel导出的功能,就顺便整理搜集了一些常用的导出文件的源代码,以供以后不时之需,也希望能给大家带来一些方便 一.DataSet数据集内数据转化为Excel // ...
- DAY11-MYSQL视图、触发器、事务、存储过程、函数
一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的 ...
- java之类和对象
类的成员: 成员变量和成员函数. 成员函数:构造函数和普通函数. 构造函数: 作用:自动对对象进行初始化 特点:1.方法名和类名一致 2.没有返回值 问: 1.我们能够定义几次构造函数? 我们可以定义 ...
- day35-hibernate映射 04-Hibernate的一级缓存:一级缓存的存在
数据源:文件和数据库.从内存中获取,不用去数据库发送SQL语句查询了.缓存技术是hibernate的一个优化的手段.Session结束了,一级缓存就没了,就销毁了.SeesionFactory没了,二 ...
- PHP trim() 函数
定义和用法 trim() 函数从字符串的两端删除空白字符和其他预定义字符. 语法 trim(string,charlist) 参数 描述 string 必需.规定要检查的字符串. charlist 可 ...
- ROS Learning-005 beginner_Tutorials 创建ROS程序包(就是软件包)
ROS Indigo beginner_Tutorials-04 创建ROS程序包(就是软件包) 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubuntu ...
- 华为2013年西安java机试题目:如何过滤掉数组中的非法字符。
这道题目为记忆版本: 题目2描述: 编写一个算法,过滤掉数组中的非法字符,最终只剩下正式字符. 示例:输入数组:“!¥@&HuaWei*&%123” 调用函数后的输出结果,数组:“Hu ...
- GPG入门
GPG入门 摘自https://www.jianshu.com/p/1257dbf3ed8e Nitroethane 关注 2016.07.19 17:36* 字数 1003 阅读 6560评 ...
- Java Collection.RP
在 Java2中,有一套设计优良的接口和类组成了Java集合框架Collection,使程序员操作成批的数据或对象元素极为方便.这些接口和类有很多对抽象数据类型操作的API,而这是我们常用的且在数据结 ...
- css中设置div水平居中,margin:0px auto没用的情况
在CSS中加了margin:0px auto;却没有效果,不能实现居中的问题!margin:0px auto;意思就是:上下边界为0,左右根据宽度自适应!就是水平居中的意思.无效的原因是,当你没有设置 ...