算法刷题记录:[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;
}
posted @ 2023-05-25 16:28  想个昵称好难ABCD  阅读(6)  评论(0编辑  收藏  举报