1 条题解

  • 0
    @ 2025-10-19 22:32:56

    题解

    这道题是关于Vigenère密码的解密问题,我们需要根据密钥和密文还原出明文。

    解题思路

    Vigenère密码的加密规则是 ( c_i = (m_i + k_i) % 26 )(其中 ( m_i ) 是明文字符对应的数字,( k_i ) 是密钥字符对应的数字,( c_i ) 是密文字符对应的数字)。那么解密时,我们可以通过公式 ( m_i = (c_i - k_i) % 26 ) 来计算明文字符对应的数字,再转换为字符即可。

    在代码中,利用了字符的ASCII码特性来简化计算:

    • 对于字母(不管大小写),字符 & 31 可以将其转换为对应的大写字母的相对位置(比如 'A' & 31 = 1'a' & 31 = 1'B' & 31 = 2'b' & 31 = 2 等),再减1就得到了该字母在0-25范围内的数字(即 ( k_i ) 或 ( c_i ))。
    • 计算 ( (c_i - k_i) % 26 ) 时,需要考虑结果为负数的情况,所以当 ( (C[i] & 31) - tmp \leq 0 ) 时,要加上26来保证结果在0-25范围内,最后再转换为对应的字符(保持原来的大小写)。

    代码解释

    1. 读取密钥字符串 K 和密文字符串 C
    2. 遍历密文字符串的每个字符:
      • 计算当前密钥字符对应的数字 tmp(K[i % K.size()] & 31) - 1,其中 i % K.size() 是为了循环使用密钥。
      • 计算明文字符对应的数字:如果 (C[i] & 31) - tmp > 0,则明文字符为 C[i] - tmp;否则为 C[i] - tmp + 26
    3. 输出解密后的明文字符串。

    这种方法通过直接操作字符的ASCII码,避免了显式的字母到数字的转换和再转换,效率很高,能够在 ( O(n) ) 的时间复杂度内解决问题(( n ) 是密文的长度),适用于题目给定的数据范围。

    • 1

    信息

    ID
    3539
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者