zoukankan      html  css  js  c++  java
  • Vigenère密码 2012年NOIP全国联赛提高组(字符串模拟)

    P1079 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 提高组 第一天 第一题

    /*
    字符串模拟
    一开始字母表打错了WA了我也是醉了 
    */
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<map>
    
    using namespace std;
    int n,ans,cnt;
    char s[26]={'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'};
    map<char,int>m;
    int f[26][26];
    bool flag[1001];
    char s1[1001],s2[1001];
    
    inline int read()
    {
        int x=0,f=1;char c=getchar();
        while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
        return x*f;
    }
    
    int main()
    {
        scanf("%s%s",s1,s2);
        int len1=strlen(s1),len2=strlen(s2);
        int pre=0,tmp=0;
        for(int i=0;i<26;i++)
        {
            pre=tmp;
            for(int j=0;j<=25;j++)
            {
                f[i][j]=tmp%26;tmp++;
            }
            pre++; tmp=pre;
        }
        for(int i=0;i<=25;i++) m[s[i]]=i;
        for(int i=0;i<len1;i++) if(s1[i]>='a' && s1[i]<='z') s1[i]-=32;
        for(int i=0;i<len2;i++) if(s2[i]>='a' && s2[i]<='z') 
          s2[i]-=32,flag[i]=true;
        int i=0,j=0;
        while(j<=len2)
        {
            int g=m[s1[i]];
            for(int a=0;a<=25;a++)
              if(s[f[g][a]]==s2[j]) 
              {
                   if(flag[j]==0) cout<<s[a];
                   else cout<<char(s[a]+32);
                   break;
              }
            i++;j++;
            if(i>=len1) i%=len1;
        }
        return 0;
    }
    折花枝,恨花枝,准拟花开人共卮,开时人去时。 怕相思,已相思,轮到相思没处辞,眉间露一丝。
  • 相关阅读:
    docker安装dvwa
    新版recon-ng安装模块
    docker多段构建nessus镜像
    docker安装Nessus
    docker快速安装openvas
    pyinstaller打包一些三方库后,报资源不存在
    python解决“failed to execute pyi_rth_pkgres”问题
    Proxmox6.2简单配置
    JavaScript全面学习(koa2.0)/MVC实现登录
    windows下react-native环境配置的那些坑
  • 原文地址:https://www.cnblogs.com/L-Memory/p/7688312.html
Copyright © 2011-2022 走看看