問題概要
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 件のコメント:
コメントを投稿