题目来源: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的更多相关文章

  1. ZOJ 1068 P,MTHBGWB

    原题链接 题目大意:给定一个字符串,先用Morse Code编码,把编码倒序,再解码成字符串.现给定处理后的字符串,求原始信息. 解法:用C++String类的函数.每次读入一个字符,就在string ...

  2. POJ题目排序的Java程序

    POJ 排序的思想就是根据选取范围的题目的totalSubmittedNumber和totalAcceptedNumber计算一个avgAcceptRate. 每一道题都有一个value,value ...

  3. ACM训练计划建议(写给本校acmer,欢迎围观和指正)

    ACM训练计划建议 From:freecode#  Date:2015/5/20 前言: 老师要我们整理一份训练计划给下一届的学弟学妹们,整理出来了,费了不少笔墨,就也将它放到博客园上供大家参考. 菜 ...

  4. 【POJ水题完成表】

    题目 完成情况 poj1000:A+B problem 完成 poj1002:电话上按键对应着数字.现在给n个电话,求排序.相同的归一类 完成 poj1003:求最小的n让1+1/2+1/3+...+ ...

  5. POJ题目细究

    acm之pku题目分类 对ACM有兴趣的同学们可以看看 DP:  1011   NTA                 简单题  1013   Great Equipment     简单题  102 ...

  6. 【转】POJ百道水题列表

    以下是poj百道水题,新手可以考虑从这里刷起 搜索1002 Fire Net1004 Anagrams by Stack1005 Jugs1008 Gnome Tetravex1091 Knight ...

  7. ACM训练计划建议(转)

    ACM训练计划建议 From:freecode#  Date:2015/5/20 前言: 老师要我们整理一份训练计划给下一届的学弟学妹们,整理出来了,费了不少笔墨,就也将它放到博客园上供大家参考. 菜 ...

随机推荐

  1. 在云服务器上体验Docker

    1. 添加Docker repository key sh -c "wget -qO- https://get.docker.io/gpg | apt-key add -" 2. ...

  2. jackson 进行json与java对象转换 之一

    代码无真相,为了最简单的说明,我直接上代码. public class User { private String name; private Gender gender; private List& ...

  3. 10-30SQLserver基础--(备份和还原、分离和附加数据库)、语句查询操作

    一.数据库是一个大容量的存储数据的仓库,为了保证数据完整性,防止一些数据的意外丢失等情况,需要对数据进行备份和还原. 备份数据不影响数据库的正常运行. 1.备份.还原数据库 首先对数据库进行备份,操作 ...

  4. leetcode559

    class Solution { public: int maxDepth(Node* root) { ; if (root != NULL) { queue<Node> Q; Q.pus ...

  5. resin容器更改JDK

    更改resin的jdk版本,找到resin的配置文件:Resin\contrib\init.resin文件,找到 JAVA_HOME=@JAVA_HOME@ RESIN_HOME=@resin_hom ...

  6. MyBatis总结一:快速入门

    简介 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单的 ...

  7. Struts2 结合 Freemarker 实例

     Freemarker 是一个不依赖 web 容器的模板引擎,一个基于模板生成文本输出的工具.其工作的原理如下图: freemarker 不是一个 web 应用的框架,而适合作为 web 应用的一个组 ...

  8. day17-jdbc 3.jdbc快速入门

    通过java程序操作数据库. 对数据库操作是对记录的操作.记录就是DML和DCL. 只要Java程序跟任何设备进行了连接,用完之后必须释放资源.最简单基础班讲I/O流,Java跟文件进行了连接,用完之 ...

  9. webService(简单小demo)

    1.什么是webService? 1.1.先说好处: WebService是两个系统的远程调用,使两个系统进行数据交互,如应用: 天气预报服务.银行ATM取款.使用邮箱账号登录各网站等. WebSer ...

  10. p3584 [POI2015]LAS

    传送门 分析 f[i][S](S∈[0,4])表示第iii个食物没有被选/左边选/右边选/同时选的状态是由哪一个状态转移来的 我们需要满足两个条件: 每个人只能选择一个  改变选择之后不会比当前获得热 ...