/*题目描述
16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加密算法 Vigenère 密码。
Vigenère 密码的加密解密算法简单易用,且破译难度比较高,曾在美国南北战争中为南军所广泛使用。
在密码学中,我们称需要加密的信息为明文,用 M 表示;称加密后的信息为密文,用 C 表示;
而密钥是一种参数,是将明文转换为密文或将密文转换为明文的算法中输入的数据,记为 k。
c = k®m
Vigenère 加密在操作时需要注意:
®运算忽略参与运算的字母的大小写,并保持字母在明文 M 中的大小写形式;
当明文 M 的长度大于密钥 k 的长度时,将密钥 k 重复使用。
例如,明文 M=Helloworld,密钥 k=abc 时,密文 C=Hfnlpyosnd。
输入格式
共 2 行。
第一行为一个字符串,表示密钥 k,长度不超过 100,其中仅包含大小写字母。
第二行为一个字符串,表示经加密后的密文,长度不超过 1000,其中仅包含大小写字母。
输出格式
一个字符串,表示输入密钥和密文所对应的明文。*/
#include <bits/stdc++.h>
using namespace std;
char Atoa(char a) {
if(a >= 'a' && a <= 'z') {
a -= 32;
}
return a;
}
int main() {
string k, c;
vector<char> kk;
cin >> k >> c;
for(int i = 0; i < k.size(); i++) {
kk.push_back(Atoa(k[i]));
}
if(kk.size() < c.size()) {
while(kk.size() < c.size()) {
int l = kk.size();
for(int i = 0; i < l; i++) {
char a = kk[i];
kk.push_back(a);
if(kk.size() >= c.size()) {
break;
}
}
}
}
for(int i = 0; i < c.size(); i++) {
if((c[i] >= 'A' && c[i] <= 'Z' && c[i] < kk[i])||(c[i] >= 'a' && c[i] <= 'z' && c[i] - 26 < kk[i])) {
c[i] += 26;
}
c[i] -= kk[i] - 'A';
}
cout << c << endl;
return 0;
}
不用理那个注释那是我复制到编译器里防止我忘了题目要求的
第二组数据正确输出是什么来着反正跟我的不一样
我输出了一堆乱码一样的东西
就这玩意↓
msf^\^rlgfkdf[ss_i]vnjnldzFJTPGFRSMMQCGABXDXKPBDYEYMd[jhm]m_mjdpegttqiotmodxrrONGESIEDWDVOPVGREMWKCOIOBTrtnhcbg`bqoo[esrjfjh`vbfplCBNOIIMYCWXTZTGLXZUAUIZQFDisi[if`lacppmekpik`tnnkjcaOEAZSZRKLRCNAISGYKEKXPNPJD_^c\^mkkqaonfbfd\r^blh_xjkEEIUYSTPVPCHTVQWQEVMBZEOEQeb\h]_lliagleg\pjjgf_wka]\OVNGHNYJWEOCUGAGTLJLFZUTYRtiggm]kjb^b`rnt^hdutfgaaeqUOPLRLYDPRMSMARIXVAKAMAXRDs[hhe]chacrlffcbusgwsrkrjcDJUFSAKYQCWCPHFHBVQPUNPECCisgf^t^\njptd`qpbc]wamqklhNHUZLNIOIWNETRWGWIWTNZOQDDas_d]_nhbb_^qocsongnf_`fqbOWGUMYSYLDBDXRMLQJLAYYEOCBtptrjflp`\ml^_ss]imghdjdq\HJEKESJAPNSCSESPJVKMZZWOUZs[jd^^[tmk_okjcjbuvbmxkscqIUOUHZXZTNIHMFHWUUAKYXPLPNfbhl\riht[ooseicd`f`mrdfagAOFWLJOYOAOLFRGIVVSKQVOQFZttqpig[kgf_f^qr^itgo_meqkqDVTVPJEDIBDSQQWGUTLHLJBXDHrnedpqkkoae_`\b\in`bwcwkbsHFKUKWKHBNCERROGMRKMBVPPMLecqgcb[btmntepckuiamgm`rprLFAZEXZOMMSCQPHDHFXTZDNJAZ
就这还是改过之后它没有换行了