※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

1240 Unreliable Message

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=1240
文字列を受け取ると一定のルールで変換して次の人に渡す人たちが6人いる。
各人が文字列を受け取った順番と変換後の文字列が渡されるので元の文字列を計算せよ。

簡単な問題です。
各人の変換ルールの逆変換を作って変換経路の文字列を逆にたどるだけで解けます。
こういう簡単な問題でちまちま正答数を稼ぐのは小銭を稼ぐような楽しさがあるかも。



#include<stdio.h>
#include<string>
#include<iostream>
#include<algorithm>
std::string J(std::string& str){
int len=str.length();
if(len<2)return str;
return str[len-1]+str.substr(0,len-1);
}
std::string C(std::string& str){
	int len=str.length();
	if(len<2)return str;
	return str.substr(1)+str[0];
}
std::string E(std::string& str){
int len=str.length();
std::string re;
int p2;
if(len<2)return str;
if(len%2==0){
	p2=len/2;
	re=str.substr(p2)+str.substr(0,p2);
}else{
	p2=len/2+1;
	re=str.substr(p2)+str[len/2]+str.substr(0,len/2);
}
return re;
}
void A(std::string& str){
int len=str.length();
char t;
for(int i=0;i<len/2;i++){
	std::swap(str[i],str[len-i-1]);
}
} 
void M(std::string& str){
char t;
for(int i=0;i<str.length();i++){
	t=str[i];
	if('0'<=t&&t<='9'){
		str[i]=(t-'0'+1)%10+'0';
	}
}
}
void P(std::string& str){
char t;
for(int i=0;i<str.length();i++){
	t=str[i];
	if('0'<=t&&t<='9'){
		str[i]=((t-'0'+10)-1)%10+'0';
	}
}
}
int main(){
std::string str,com;
int n;
std::cin>>n;
while(n--){
	std::cin>>com>>str;
	for(int i=com.length()-1;i>=0;i--){
		char t=com[i];
		if(t=='A')A(str);
		if(t=='J')str=J(str);
		if(t=='M')M(str);
		if(t=='P')P(str);
		if(t=='E')str=E(str);
		if(t=='C')str=C(str);
	}
	std::cout<<str<<"\n";
}
}