問題概要
6人の公務員が王にメッセージを渡したかった。
だがしかし6人の公務員はメッセージを少し変えてしまう。
文字列を復元せよ。
J君:1つずつ左にすべての文字を回転させる。(例)aB23d→B23da
C君:1つずつ右にすべての文字を回転させる。(例)aB23d→daB23
E君:左半分と右半分の文字を入れ替える。文字数が奇数なら真ん中の文字はそのまま。
(例)e3ac→ace3 aB23d→3d2aB
A君:メッセージを逆にする。(例)aB23d→d32Ba
P君:全ての数字に1を加える。但し9なら0になる。(例)aB23d→aB34d e9ac→e0ac
M君:全ての数字から1を引く。但し0なら9になる。(例)aB23d→aB12d e0ac→e9ac
解法
復元なので経由順を逆にして、変更時の動作も逆にする。
ソース
#include<iostream>
#include<string>
#include<algorithm>
#include<cctype>
using namespace std;
int main(){
int n;
cin >> n;
while(n--){
string done,message;
cin >> done >> message;
reverse(done.begin(),done.end());
for(int i = 0 ; i < done.size() ; i++ ){
switch(done[i]){
case 'J':
rotate(message.begin(),message.begin()+message.size()-1,message.end());
break;
case 'C':
rotate(message.begin(),message.begin()+1,message.end());
break;
case 'E':
for(int j = 0 ; j < message.size() / 2 ; j++ ){
swap(message[j],message[(message.size()+1)/2+j]);
}
break;
case 'A':
reverse(message.begin(),message.end());
break;
case 'P':
for(int j = 0 ; j < message.size() ; j++ ){
if(isdigit(message[j])) message[j] = (message[j]-'0'+9)%10+'0';
}
break;
case 'M':
for(int j = 0 ; j < message.size() ; j++ ){
if(isdigit(message[j])) message[j] = (message[j]-'0'+1)%10+'0';
}
break;
}
}
cout << message << endl;
}
}
rotate()を使いたかったからやった(小声)
0 件のコメント:
コメントを投稿