2013年11月16日土曜日

AOJ1240 Unreliable Message

問題概要


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 件のコメント:

コメントを投稿