zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    “Swift Language Version” (SWIFT_VERSION) build setting must be set to a supported value for targets which use Swift
    webSocket通讯
    动画效果
    史上最简单MySQL教程详解(进阶篇)之视图
    “野生”程序猿写博客一年的感悟
    成都“小甜甜”:她给了男人希望,男人却被嘲笑X丝
    史上最简单MySQL教程详解(进阶篇)之索引及失效场合总结
    SpringBoot简明教程之快速创建第一个SpringBoot应用
    史上最简单MySQL教程详解(进阶篇)之深入理解事务处理内部的动作
    史上最简单MySQL教程详解(进阶篇)之锁与事务处理分离水平(二)
  • 原文地址:https://www.cnblogs.com/zhangone/p/5111232.html
Copyright © 2011-2022 走看看