JOI 2006 問題3

ガイウス・ユリウス・カエサル(Gaius Julius Caesar), 英語読みでジュリアス・シーザー(Julius Caesar)は, 古代ローマの軍人であり政治家である. カエサルは, 秘密の手紙を書くときに, 'A' を 'D' に, 'B' を 'E' に, 'C' を 'F' に, というように3つずらして表記したという記録が残っている.

大文字のアルファベット26文字だけからなる文字列を, カエサルがしたように3文字ずつずらす変換を施し得られた文字列がある. このような文字列を元の文字列に戻すプログラムを作成せよ.

各文字の変換前と変換後の対応は次のようになる.

      変換前    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 
      変換後    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 C

例えば, この方法で文字列 JOI を変換すると MRL が得られ, この方法で変換された文字列 FURDWLD の元の文字列は CROATIA である.

 

変換後から変換前にすれば良い。文字列を操作するのでstringをincludeする。

この場合、mapという特別な配列を使用すれば一瞬で解ける。

D→Aなので、

v['D']='A'というように考えていけば良い。

#include <iostream>
#include <string>
#include <map>
using namespace std;
int main() {
string s;
cin >> s;//文字を読み込む
map<char, char>m;
m['D'] = 'A';
m['E'] = 'B';
m['F'] = 'C';
m['G'] = 'D';
m['H'] = 'E';
m['I'] = 'F';
m['J'] = 'G';
m['K'] = 'H';
m['L'] = 'I';
m['M'] = 'J';
m['N'] = 'K';
m['O'] = 'L';
m['P'] = 'M';
m['Q'] = 'N';
m['R'] = 'O';
m['S'] = 'P';
m['T'] = 'Q';
m['U'] = 'R';
m['V'] = 'S';
m['W'] = 'T';
m['X'] = 'U';
m['Y'] = 'V';
m['Z'] = 'W';
m['A'] = 'X';
m['B'] = 'Y';
m['C'] = 'Z';
for (int i = 0; i < s.size(); i++) {
s[i] = m[s[i]];//ex)s[i]がDの場合m[D]はAである
}
cout << s << endl;
return 0;
}