NOIP 2012 Vigenère 密码

洛谷 P1079 Vigenère 密码

https://www.luogu.org/problemnew/show/P1079

JDOJ 1779: [NOIP2012]Vigenèr密码 D1 T1

https://neooj.com:8082/oldoj/problem.php?id=1779

题目描述

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

在密码学中,我们称需要加密的信息为明文,用 M表示;称加密后的信息为密文,用C表示;而密钥是一种参数,是将明文转换为密文或将密文转换为明文的算法中输入的数据,记为kk。 在 VigenèreVigene`re 密码中,密钥kk是一个字母串,k=k_1,k_2,…,k_nk=k1,k2,,kn。当明文 M=m_1,m_2,…,m_nM=m1,m2,,mn时,得到的密文 C=c_1,c_2,…,c_nC=c1,c2,,cn,其中c_ici=m_imi®k_iki,运算®的规则如下表所示:

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

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

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

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

输入输出格式

输入格式:

共 2 行。

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

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

输出格式:

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

输入输出样例

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

说明

【数据说明】

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

NOIP 2012 提高组 第一天 第一题

 
 一看到那个图片,不用说了,打表吧。
有的大佬使用一些高端操作可以不用手动复制粘贴就可以把表存到数组中,原谅我不会。
本以为手打很稳妥了,但还是错了,错的很惨,为什么呢?
 
不能把原表原封不动地打进去。
你要注意你打进去的是1行还是0行。
读的时候是从1开始还是从0开始。
这就是细节,细节决定成败。
然后还有一些基本技巧,比如大小写转换。
CODE:
#include<bits/stdc++.h>
using namespace std;
string c1,c2;
bool k[1005]; 
char a[27][27]={
{"abcdefghijklmnopqrstuvwxyz"}, 
{"zabcdefghijklmnopqrstuvwxy"},
{"yzabcdefghijklmnopqrstuvwx"},
{"xyzabcdefghijklmnopqrstuvw"},
{"wxyzabcdefghijklmnopqrstuv"},
{"vwxyzabcdefghijklmnopqrstu"},
{"uvwxyzabcdefghijklmnopqrst"},
{"tuvwxyzabcdefghijklmnopqrs"},
{"stuvwxyzabcdefghijklmnopqr"},
{"rstuvwxyzabcdefghijklmnopq"},
{"qrstuvwxyzabcdefghijklmnop"},
{"pqrstuvwxyzabcdefghijklmno"},
{"opqrstuvwxyzabcdefghijklmn"},
{"nopqrstuvwxyzabcdefghijklm"},
{"mnopqrstuvwxyzabcdefghijkl"},
{"lmnopqrstuvwxyzabcdefghijk"},
{"klmnopqrstuvwxyzabcdefghij"},
{"jklmnopqrstuvwxyzabcdefghi"},
{"ijklmnopqrstuvwxyzabcdefgh"},
{"hijklmnopqrstuvwxyzabcdefg"},
{"ghijklmnopqrstuvwxyzabcdef"},
{"fghijklmnopqrstuvwxyzabcde"},
{"efghijklmnopqrstuvwxyzabcd"},
{"defghijklmnopqrstuvwxyzabc"},
{"cdefghijklmnopqrstuvwxyzab"},
{"bcdefghijklmnopqrstuvwxyza"},
};
int main()
{
    cin>>c2>>c1;
    int n1=c1.length(),n2=c2.length(); 
    for(int i=0;i<n1;i++)
    {
        if(c1[i]>='A' && c1[i]<='Z')
        {
            c1[i]=c1[i]-'A'+'a'; 
            k[i]=1;
        }
    }
    for(int i=0;i<n2;i++)
        if(c2[i]>='A' && c2[i]<='Z')
            c2[i]=c2[i]-'A'+'a';
    for(int i=0;i<n1;i++)
    {
        int s=i%n2;
        int a1=c1[i]-'a'; 
        int a2=c2[s]-'a';
        if(k[i]==1)
            cout<<char(a[a2][a1]-'a'+'A');
        else
            cout<<a[a2][a1];
    }
    return 0;
}
原文地址:https://www.cnblogs.com/fusiwei/p/11220962.html