算法刷题记录:[NOIP2012]Vigenère 密码
题目链接
https://ac.nowcoder.com/acm/contest/19306/1052
题目分析
根据题目给的图发现,密文的会因为密钥的起始位置去偏移,形成了一个环。
所以只要我们知道密钥的起始位置,和密钥与密钥的距离(密文-密钥),就可以求出对于该密钥的明文的位置。
AC代码
#include <iostream>
using namespace std;
string k, s, ans;
int main()
{
cin >> k >> s;
for (int i = 0; i < k.size(); ++ i)
if (k[i] < 97) k[i] += 32;
int j = 0, pos = 0;
for (int i = 0; i < s.size(); ++ i)
{
int mod = j % k.size();
int yao = k[mod] - 'a';
if (s[i] >= 97 && s[i] <= 122) // 小写的情况
{
int mi = s[i] - 'a';
pos = (mi - yao + 26) % 26;
ans.push_back(pos + 'a');
}
else // 大写的情况
{
int mi = s[i] - 'A';
pos = (mi - yao + 26) % 26;
ans.push_back(pos + 'A');
}
j ++ ;
}
cout << ans;
return 0;
}
本文来自博客园,作者:想个昵称好难ABCD,转载请注明原文链接:https://www.cnblogs.com/ClockParadox43/p/17431733.html