map——映射(message.cpp)

信息交换

(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的函数

这道题的代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<map>
 4 #include<string>
 5 
 6 using namespace std;
 7 
 8 map<char,char> bianma;
 9 
10 string a,b,c;
11 int cishu=0;
12 
13 int main()
14 {
15     freopen("message.in","r",stdin);
16     freopen("message.out","w",stdout);
17     cin>>a>>b>>c;
18     for(int i=0;i < a.length(); i++)
19     {
20         if(bianma.count(a[i]))
21         {
22             if(bianma[a[i]]!=b[i])
23             {
24                 cout<<"Failed";
25                 return 0;
26             }
27         }
28         else
29         {
30                 cishu++;
31                 bianma[a[i]]=b[i];
32         }
33     }
34     if(cishu!=26)
35     {
36         cout<<"Failed";
37         return 0;
38     }
39     for(int i=0;i<=c.length();i++)
40     {
41         c[i]=bianma[c[i]];
42     }
43     cout<<c;
44     return 0;
45 } 

(本代码原题能过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

原文地址:https://www.cnblogs.com/zhangone/p/5111232.html