zoukankan      html  css  js  c++  java
  • 洛谷-P1079 [NOIP2012 提高组] Vigenère 密码

    洛谷-P1079 [NOIP2012 提高组] Vigenère 密码

    原题链接:https://www.luogu.com.cn/problem/P1079


    题目描述

    16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加密算法 Vigenère 密码。Vigenère 密码的加密解密算法简单易用,且破译难度比较高,曾在美国南北战争中为南军所广泛使用。

    在密码学中,我们称需要加密的信息为明文,用 (M) 表示;称加密后的信息为密文,用 (C) 表示;而密钥是一种参数,是将明文转换为密文或将密文转换为明文的算法中输入的数据,记为 (k)。 在 Vigenère 密码中,密钥 (k) 是一个字母串,(k=k_1,k_2,…,k_n)。当明文 (M=m_1,m_2,…,m_n) 时,得到的密文 (C=c_1,c_2,…,c_n),其中 (c_i)=(m_i)®(k_i),运算®的规则如下表所示:

    img

    Vigenère 加密在操作时需要注意:

    1. ®运算忽略参与运算的字母的大小写,并保持字母在明文 (M) 中的大小写形式;
    2. 当明文 (M) 的长度大于密钥 (k) 的长度时,将密钥 (k) 重复使用。

    例如,明文 (M= exttt{Helloworld}),密钥 (k= exttt{abc}) 时,密文 (C= exttt{Hfnlpyosnd})

    img

    输入格式

    共 2 行。

    第一行为一个字符串,表示密钥 (k),长度不超过 (100),其中仅包含大小写字母。

    第二行为一个字符串,表示经加密后的密文,长度不超过 (1000),其中仅包含大小写字母。

    输出格式

    一个字符串,表示输入密钥和密文所对应的明文。

    输入输出样例

    输入 #1

    CompleteVictory
    Yvqgpxaimmklongnzfwpvxmniytm
    

    输出 #1

    Wherethereisawillthereisaway
    

    说明/提示

    对于 (100\%) 的数据,输入的密钥的长度不超过 (100),输入的密文的长度不超过 (1000),且都仅包含英文字母。

    NOIP 2012 提高组 第一天 第一题

    C++代码

    #include <iostream>
    #include <cstring>
    using namespace std;
    
    int main() {
        string k, c, m;
        cin >> k >> c;
        m = c;
        int len = k.size();
        for (int i=0; i<len; ++i)
            k[i] = toupper(k[i]);
        for (int i=0; i<c.size(); ++i) {
            m[i] = (c[i]>='a')?'a':'A';
            c[i] = toupper(c[i]);
            m[i] += (c[i] - k[i%len] + 26) % 26;
        }
        cout << m << endl;
        return 0;
    }
    
  • 相关阅读:
    windows中dos命令指南
    HDU 2084 数塔 (dp)
    HDU 1176 免费馅饼 (dp)
    HDU 1004 Let the Balloon Rise (map)
    变态杀人狂 (数学)
    HDU 2717 Catch That Cow (深搜)
    HDU 1234 开门人和关门人 (模拟)
    HDU 1070 Milk (模拟)
    HDU 1175 连连看 (深搜+剪枝)
    HDU 1159 Common Subsequence (dp)
  • 原文地址:https://www.cnblogs.com/yuzec/p/14411090.html
Copyright © 2011-2022 走看看