1 条题解

  • 0
    @ 2025-8-24 21:20:42

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar ingu
    **

    搬运于2025-08-24 21:20:41,当前版本为作者最后更新于2018-03-21 22:42:18,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    我来发个代码稍短一点的题解。

    铺垫一个关于ASCII码的小知识:字母'A'的ASCII码是41H(0100 0001B),字母'a'的ASCII码是61H(0110 0001B),字母'A'与'a'的二进制后5位是相同的,所以无论是大写字母还是小写字母x,x &31(1 1111B)的值就是x在字母表里的顺序。

    开始题解:本题的目的就是问你如何去篡位,例如秘钥k里面的字符'C'代表的就是明文向后篡2位得到密文,反过来已知密文,'C'代表的就是向前篡2位,这样'Y'就得到了'W'。

    而篡位是有边界的,就是如果篡过了头,需要再回来,A之后就是Z了。所以需要判断一下密文的和篡位之间的大小,如果篡位大,需要补26.

    参考代码:

    #include <iostream>
    using namespace std;
    int main() {
    	string k,c;
    	cin>>k>>c;
    	for (int i=0;i<c.length();i++) {
    		int t=(k[i%k.length()]&31)-1;
    		c[i]=(c[i]&31)-t>0?c[i]-t:c[i]-t+26;
    	}
    	cout<<c<<endl;
    	return 0;
    }
    
    
    • 1

    信息

    ID
    81
    时间
    1000ms
    内存
    125MiB
    难度
    2
    标签
    递交数
    1
    已通过
    0
    上传者