• Noip2012 提高组 Day1 T1 Vigenère 密码


    题目描述

    16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加密算法――Vigenère 密

    码。Vigenère 密码的加密解密算法简单易用,且破译难度比较高,曾在美国南北战争中为

    南军所广泛使用。

    在密码学中,我们称需要加密的信息为明文,用 M 表示;称加密后的信息为密文,用

    C 表示;而密钥是一种参数,是将明文转换为密文或将密文转换为明文的算法中输入的数据,

    记为 k。 在 Vigenère 密码中,密钥 k 是一个字母串,k=k1k2…kn。当明文 M=m1m2…mn时,

    得到的密文 C=c1c2…cn,其中 ci=mi®ki,运算®的规则如下表所示:

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

    1. ®运算忽略参与运算的字母的大小写,并保持字母在明文 M 中的大小写形式;

    2. 当明文 M 的长度大于密钥 k 的长度时,将密钥 k 重复使用。

    例如,明文 M=Helloworld,密钥 k=abc 时,密文 C=Hfnlpyosnd。

    输入输出格式

    输入格式:

    输入共 2 行。

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

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

    输出格式:

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

    输入输出样例

    输入样例#1: 
    CompleteVictory
    Yvqgpxaimmklongnzfwpvxmniytm 
    输出样例#1: 
    Wherethereisawillthereisaway 

    说明

    【数据说明】

    对于 100%的数据,输入的密钥的长度不超过 100,输入的密文的长度不超过 1000,且

    都仅包含英文字母。

    NOIP 2012 提高组 第一天 第一题

    思路:

      若把字符串均视为其ASCall码,模拟可得运算®的规则即为:

                    明文的ASCall码-密钥的ASCall码(当得数为负值时还需要用26减去该得数转为正值)

    坑点:

      需要注意的是大小写的判断输出(哈哈我是打表做的啦~)

    上代码:

    #include <iostream>
    #include <cstdio>
    #include <cmath>
    #include <cstring>
    using namespace std;
    
    const int e = 26;
    const char en[e] = {'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'};
    const char En[e] = {'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'};
    const int Mod = 32;
    const int M1 = 105;
    const int M2 = 1005;
    char k[M1],Mw[M2];
    int tk[M1],tmp[M2],p[M2];
    bool pd[M2];
    
    int main() {
        cin>>k;
        int klen=strlen(k);
        cin>>Mw;
        int Mlen=strlen(Mw);
        for(int i=0; i<klen; i++) tk[i]=(k[i]-'A')%Mod;
        for(int i=0,now; i<Mlen; i++) {
            now=Mw[i]-'A';
            if(now<Mod) pd[i]=true,tmp[i]=now;
            else tmp[i]=now%Mod;
        }
        for(int i=0,now; i<Mlen; i++) {
            now=i%klen;
            p[i]=tmp[i]-tk[now];
            if(p[i]<0) p[i]+=e;
            if(pd[i]) printf("%c",En[p[i]]);
            else printf("%c",en[p[i]]);
        }
        return 0;
    } 

    如果运气好也是错,那我倒愿意错上加错!

    ❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀

  • 相关阅读:
    处理ORACLE死锁
    正则表达式 浮点数 整型
    Oracle数据类型number(m,n)
    chm文件打开无法正常显示内容
    安装PHP程序提示“include_path='.;c:php5pear'”错误的解决方法
    mysql数据导入数据报错(数据丢失)
    微信小程序如何与数据库交互?
    Eclipse 常用快捷键
    深入理解BodyTagSupport,包括SKIP_PAGE, EVAL_PAGE等
    JSP自定义标签Taglib实现过程重点总结
  • 原文地址:https://www.cnblogs.com/zxqxwnngztxx/p/7747028.html
Copyright © 2020-2023  润新知