10223 Caesar密码

题目描述

在元老院的支持下,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题解代码图片