P1079 [NOIP2012 提高组] Vigenère 密码 题解

King_xjl

2022-05-03 20:28:36

Personal

题面:P1079

解析:一道纯模拟题。但是处理时比较复杂。我做了两个小时。 要注意k的循环。

代码:

#include <bits/stdc++.h>
using namespace std;
char k[1001], a1[1001], ans[1001];
int main() 
{
    //freopen("vigenere.in", "r", stdin);
    //freopen("vigenere.out", "w", stdout);
    cin >> k >> a1;
    for(int i = 0, kk = 0; i <= strlen(a1) - 1; i++) {
        int a11 = 0;
        if(a1[i] >= 'a' && a1[i] <= 'z') {
            a11 += a1[i] - 'a';  ans[i] = 'a';
        }
        if(a1[i] >= 'A' && a1[i] <= 'Z') {
            a11 += a1[i] - 'A'; ans[i] = 'A';
        }
        if(k[kk] >= 'a' && k[kk] <= 'z')  {
            a11 -= k[kk] - 'a';
        }
        if(k[kk] >= 'A' && k[kk] <= 'Z') {
            a11 -= k[kk] - 'A';
        } 
        kk = (kk + 1) % strlen(k);
        printf("%c", ans[i] + (a11 + 26) % 26); 
    }
    return 0;
}
/*
CompleteVictory
Yvqgpxaimmklongnzfwpvxmniytm
*/