華為oj:文字列暗号化


/*は、スプーンとして単語を使用するデータを暗号化するテクニックを説明します.次に、その動作原理を示します.まず、TRAILBLaZERSのような単語をスプーンとして選択します.単語に重複するアルファベットが含まれている場合は、1番目だけを残し、残りのいくつかは破棄します.現在、修正された単語はアルファベット表の下で死んでいます.A B C D E F G H I JKLMNO P Q R S T U V W X Y Z T R I L B Z E S C D F G H JMNO P Q U V W Xの上に他のアルファベット表の残りのアルファベットで完全に埋め込まれています.情報を暗号化する場合、情報の各アルファベットは上の行に固定され、次の行の対応するアルファベットで原文のアルファベットに置き換えられます(アルファベット文字の大文字と小文字の状態は保持されます).そのため、このスプーンを使用すると、アタックAT DAWN(黎明時攻撃)はTpptad TP ITVHに暗号化されます.下記のインタフェースを実現し、指定したスプーンと明文で密文を得てください.詳細説明:インタフェース説明プロトタイプ:voidencrypt(char*key,char*data,char*encrypt);入力パラメータ:char*key:スプーンchar*data:明文出力パラメータ:char*encrypt:密文戻り値:void入力先入力keyと暗号化する文字列出力暗号化後の文字列サンプル入力nihao niサンプル出力le
構想分析:鍵を得た後に、まず鍵の中で重複する単語を排除して、新しい鍵は文字型の容器の中で置いて、それから26個の大文字を添加して、パスワードT R A I L B Z E S C D F G H JK MN O P Q U V WX Yを構成して明文とパスワードを対応して、明文の文字のAsciiコードの値は対応する下の標識に転化して、同時に大文字と小文字に注意します
*/
#include <iostream> 
#include <string> 
#include <algorithm> 
#include <vector> 
#include<cctype>
using namespace std;

int main(){
    string key, data;
    cin >> key;
    cin>> data;
    vector<char> v;
    for (int i = 0; i != key.size(); ++i)
    {
        key[i] = toupper(key[i]);
        if (find(v.begin(), v.end(), key[i]) == v.end()) v.push_back(key[i]);
    }
    for (int i = 0; i < 26; ++i)
    {
        if (find(v.begin(), v.end(), 'A' + i) == v.end()) v.push_back('A' + i);
    }
    //       
    for (int i = 0; i != data.size(); ++i)
    {
        if (isupper(data[i]))
            cout << v[data[i] - 65];
        else{
            data[i]=toupper(data[i]);
            v[data[i] - 65] = tolower(v[data[i] - 65]);
            cout << v[data[i] - 65];

        }   
    }
    return 0;
}