题目描述
在元老院的支持下,Caesar率领罗马军团进攻高卢地区。但是他的军事行动并不顺利,他急需你的支持。
一天,你突然受到Caesar从前线写来的信。为了防止敌军偷窃情报,Caesar决定用自创的密码来写这封信。但是面对满纸的乱码,你也无从下手。于是你前往元老院询问这种密码的玄机。
元老们告诉你,这是凯撒移位密码(世界上最早的加密术——编者注),解读它非常的简单:
对于明文中的每个字母,Caesar会用它后面的第t个字母代替。例如,当t=3时,字母A将变成C,字母B将变成D,……,字母Y将变成A,字母Z将变成B(假设字母表是循环的)。
这样一来,
字母表:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
将变成:C D E F G H I J K L M N O P Q R S T U V W X Y Z A B
明文: I Need Soldiers 将加密为
密文: K Pggf Uqnfkgtu
如此一来,需要传达的信息在外人看来就如同天书了。加上Caesar会不时更换t的值,使得密码变得更加难以捉摸。
你的任务就是找出每次“乱码”中的偏移量t
输入格式你将得到一段Caesar的密码,我们保证这是一句成文的英文句子,但是不能保证大小写。
输出格式对于每个句子,输出偏移量
样例输入 #1
NS BFW, JAJSYX TK NRUTWYFSHJ FWJ YMJ WJXZQY TK YWNANFQ HFZXJX
输出 #1
5
数据范围与提示
经过语言学家的研究,在英文文献中,在每一篇文章里,e的出现次数最多,本题中的所有测试数据皆满足这个条件。
分类标签C++题解代码
#include <bits/stdc++.h>
using namespace std;
string a;
int b;
int e;
int f;
int d;
int g;
int c[128];
// The main procedure
int main() {
getline(cin, a);
for (int i = 0; i < a.size(); i++) {
c[(int)a[i]]++;
}
b = (int)'a';
d = (int)'A';
e = 0;
for (int i = 0; i < 26; i++) {
f = (c[b]+c[d]);
if (f > e) {
e = f;
g = i;
}
b++;
d++;
}
g = (g-((int)'E'-(int)'A'));
if (g < 0) {
g = (g+26);
}
cout<<g;
return 0;
}
Blockly题解代码图片