map——映射(message.cpp)
2016-01-07 21:18
330 查看
信息交换
(message.cpp)
【题目描述】
Byteland战火又起,农夫John派他的奶牛潜入敌国获取情报信息。
Cow历尽千辛万苦终于将敌国的编码规则总结如下:
1 编码是由大写字母组成的字符串。
2 设定了密字。加密的过程就是把原信息的字母替换成对应密字。
3 一个字母有且仅有一个对应密字,不同字母对应不同密字。
如今,Cow终于获取了敌国发送的一条加密信息和对应的原信息。Cow如下破解密码:扫描原信息,对于原信息中的字母x,找到它在加密信息中的对应大写字母y,且认为y是x的密字。
Cow的工作停止于以下情况:
1 信息扫描完毕且没有差错
2 扫描完毕但有字母没有在原信息中出现。
3 扫描中出现矛盾或错误,即违反上述的规则。
现在,John发来信息,要求Cow利用破译的密字翻译一条刚刚截获的敌国信息。
【文件格式】
输入文件:
第一行为Cow知道的一条加密信息。
第二行为加密信息的原信息。
第三行为John要求Cow翻译的加密信息。
输出文件:
一行,如果出现2 3 所示的停止情况则输出“Failed”,否则翻译John传送的信息。
【样例数据】
#1
Input
QWERTYUIOPLKJHGFDSAZXCVBN
ABCDEFGHIJKLMNOPQRSTUVWXY
DSLIEWO
Output
Failed
#2
Input
QWERTYUIOPLKJHGFDSAZXCVBNM
ABCDEFGHIJKLMNOPQRSTUVWXYZ
IQHPOQKGHU
Output
HANJIALONG
这道题直接上map映射就可以了
下面上资料:
map的基本操作函数:
C++ Maps是一种关联式容器,包含“关键字/值”对
begin() 返回指向map头部的迭代器
clear() 删除所有元素
count() 返回指定元素出现的次数
empty() 如果map为空则返回true
end() 返回指向map末尾的迭代器
equal_range() 返回特殊条目的迭代器对
erase() 删除一个元素
find() 查找一个元素
get_allocator() 返回map的配置器
insert() 插入元素
key_comp() 返回比较元素key的函数
lower_bound() 返回键值>=给定元素的第一个位置
max_size() 返回可以容纳的最大元素个数
rbegin() 返回一个指向map尾部的逆向迭代器
rend() 返回一个指向map头部的逆向迭代器
size() 返回map中元素的个数
swap() 交换两个map
upper_bound() 返回键值>给定元素的第一个位置
value_comp() 返回比较元素value的函数
这道题的代码:
#include<iostream> #include<cstdio> #include<map> #include<string> using namespace std; map<char,char> bianma; string a,b,c; int cishu=0; int main() { freopen("message.in","r",stdin); freopen("message.out","w",stdout); cin>>a>>b>>c; for(int i=0;i < a.length(); i++) { if(bianma.count(a[i])) { if(bianma[a[i]]!=b[i]) { cout<<"Failed"; return 0; } } else { cishu++; bianma[a[i]]=b[i]; } } if(cishu!=26) { cout<<"Failed"; return 0; } for(int i=0;i<=c.length();i++) { c[i]=bianma[c[i]]; } cout<<c; return 0; }
(本代码原题能过9个点)
============================分割线=================================
2016.1.7 21:24更新
刚刚又看了一下测试点,没过的那个点原因找到了:
第三个点
QWERTYUIOPLKJHGFDSAZXCVBNM
QWERTYUIOPLKJHGFDSAZXCVBNN
HIJACK
没看如果这个字母如果被映射过怎么办(第二行里的那个N)
这一次用了两个map,另一个用来个反向判断,代码如下:
#include<iostream> #include<cstdio> #include<map> #include<string> using namespace std; map<char,char> bianma; map<char,char> jiaodui; string a,b,c; int cishu=0; int main() { freopen("message.in","r",stdin); freopen("message.out","w",stdout); cin>>a>>b>>c; for(int i=0;i < a.length(); i++) { if(bianma.count(a[i])||jiaodui.count(b[i])) { if(bianma[a[i]]!=b[i]||jiaodui[b[i]]!=a[i]) { cout<<"Failed"; return 0; } } else { cishu++; bianma[a[i]]=b[i]; jiaodui[b[i]]=a[i]; } } if(cishu!=26) { cout<<"Failed"; return 0; } for(int i=0;i<=c.length();i++) { c[i]=bianma[c[i]]; } cout<<c; return 0; }
(这次十个点全过)
附:本题测试数据:http://files.cnblogs.com/files/zhangone/message.zip
相关文章推荐
- C++ operator关键字(重载操作符)
- C++学习笔记(一)
- C++模版总结(2/2)
- c++实现gray code(格雷码)
- FileTool.exe 替换 Visual C++ 中的打开和添加到项目功能
- 《C++Primer 5e》学习笔记(6):类
- c++ 优秀文章
- 【C++11新特性】 nullptr关键字
- C和C++内存管理详解
- 欢迎使用CSDN-markdown编辑器
- explicit C++关键字
- C++错误调试集锦
- ubuntu 安装 GCC 和 G++ C++ 开发环境
- 新手学习C++笔记6:头文件和析构函数
- POJ 1007_DNA Sorting
- C语言之理解main 参数意义
- c++ 与C#比较
- 分享C++/C如何开机自动启动代码和c的改错题
- C++ 键盘钩子
- C语言socket 蓝牙文件传输