【华为OJ】字符串加密

描述

有一种技巧可以对数据进行加密,它使用一个单词作为它的密匙。下面是它的工作原理:首先,选择一个单词作为密匙,如TRAILBLAZERS。如果单词中包含有重复的字母,只保留第1个,其余几个丢弃。现在,修改过的那个单词死于字母表的下面,如下所示:

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

T R A I L B Z E S C D F G H J K M N O P Q U V W X Y

上面其他用字母表中剩余的字母填充完整。在对信息进行加密时,信息中的每个字母被固定于顶上那行,并用下面那行的对应字母一一取代原文的字母(字母字符的大小写状态应该保留)。因此,使用这个密匙,Attack AT DAWN(黎明时攻击)就会被加密为Tpptad TP ITVH。

请实现下述接口,通过指定的密匙和明文得到密文。

详细描述:

接口说明

原型:

voidencrypt(char * key,char * data,char * encrypt);

输入参数:

    char * key:密匙

    char * data:明文

输出参数:

    char * encrypt:密文

返回值:

        void

 

 

知识点 字符串
运行时间限制 10M
内存限制 128
输入

先输入key和要加密的字符串

输出

返回加密后的字符串

样例输入 nihao ni
样例输出 le
思路:
该题关键是密钥的生成,可以分为三步:
1.原密钥去重
2.将剩下的字母按照字母表的顺序补齐,确保新密钥的大小是26
3.根据新密钥,得到加密后的结果
源代码:
  1. #include <iostream>  
  2. #include <string>  
  3. #include <vector>  
  4. #include <algorithm>  
  5. using namespace std;  
  6. vector<char> getNewKey(string key){  
  7.     vector<char> newKey;  
  8.     int size = key.size();  
  9.     bool duplicated[26] = { false };  
  10.     for (int i = 0; i < size; i++){  
  11.         if (key[i] >= 'A' && key[i] <= 'Z' && duplicated[key[i] - 'A'] == false){  
  12.             newKey.push_back(key[i]);  
  13.             duplicated[key[i] - 'A'] = true;  
  14.         }  
  15.         else if (key[i] >= 'a' && key[i] <= 'z' && duplicated[key[i] - 'a'] == false){  
  16.             newKey.push_back(key[i]);  
  17.             duplicated[key[i] - 'a'] = true;  
  18.         }  
  19.     }  
  20.     return newKey;  
  21. }  
  22. void Encrypt(string key, string data, string& res){  
  23.     vector<char> newKey = getNewKey(key);  
  24.     char seq[26];//记录密码序列  
  25.     bool count[26] = { false };  
  26.     for (int i = 0; i < newKey.size(); i++){  
  27.         if (newKey[i] <= 'z' && newKey[i] >= 'a'){  
  28.             seq[i] = newKey[i] - 'a' + 'A';  
  29.             count[newKey[i] - 'a'] = true;  
  30.         }     
  31.         else{  
  32.             seq[i] = newKey[i];  
  33.             count[newKey[i] - 'A'] = true;  
  34.         }  
  35.               
  36.     }  
  37.     int k = newKey.size();  
  38.     for (int i = 0; i < 26; i++){  
  39.         if (!count[i]){  
  40.             seq[k] = 'A' + i;  
  41.             k++;  
  42.         }     
  43.     }  
  44.     for (int i = 0; i < data.size(); i++){  
  45.         if (data[i] == ' ')  
  46.             res[i] = ' ';  
  47.         else if(data[i] <= 'z' && data[i] >= 'a'){  
  48.             res[i] = seq[data[i] - 'a'] - 'A' + 'a';  
  49.         }  
  50.         else{  
  51.             res[i] = seq[data[i] - 'A'];  
  52.         }  
  53.     }  
  54. }  
  55. void main(){  
  56.     string key, data;  
  57.     getline(cin, key);  
  58.     //vector<char> newKey = getNewKey(key);  
  59.     //for (int i = 0; i < newKey.size(); i++)  
  60.     //  cout << newKey[i];  
  61.       
  62.     getline(cin,data);  
  63.     string res = data;  
  64.     Encrypt(key, data, res);  
  65.     cout << res << endl;  
  66. }  






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值