1 条题解

  • 0
    @ 2026-10-26 21:53:09

    思路与算法

    将密文字母与密钥字母都看成0至25的编号。第i个位置使用k[i mod |k|],减去其位移后加26取模,再以密文字母对应的大小写基准转回字符。

    正确性说明

    加密表是模26加法,因此减去同一密钥位移就是唯一逆运算。密钥周期下标与加密一致,大小写只决定输出基准,不参与位移,所以逐字符还原明文。

    复杂度

    读入和处理O(|k|+|s|)时间,存两个输入串O(|k|+|s|)空间;除输入输出外辅助O(1)。

    易错点

    密钥大小写不改变位移,输出须保留明文字母大小写。先加26防止负余数;字符均为题设英文字母,ctype调用落在合法ASCII范围。

    参考代码(C++11)

    #include <bits/stdc++.h>
    using namespace std;
    int main() {
        string k, s;
        cin >> k >> s;
        for (int i = 0; i < (int)s.size(); i++) {
            char base = isupper(s[i]) ? 'A' : 'a';
            int v = tolower(k[i % k.size()]) - 'a';
            s[i] = base + (s[i] - base - v + 26) % 26;
        }
        cout << s << '\n';
    }
    
    • 1

    信息

    ID
    1865
    时间
    1000ms
    内存
    64MiB
    难度
    进阶
    标签
    递交数
    0
    已通过
    0
    上传者