RUPC (Ritsumeikan University Programming Contest) 2011 Problem A Swap Cipher

問題

文字列に対して以下の操作を繰り返した。

  • a[i]文字目とb[i]文字目を入れ替え、a[i]文字目、b[i]文字目のアルファベットをb[i]-a[i]だけ前にずらす。(ただしaの前の文字はzとする)


操作の列および、操作後の文字列が与えられるとき、
操作前の文字列を求めよ。

制約条件

文字列に現れるのは全て英小文字
文字列の長さ≦100

方針

操作を逆向きに行う。
char型がオーバーフローすることに注意する必要がある。(これでハマった)

ソースコード

int main()
{
	int n;
	while(cin>>n,n){
		string msg; cin>>msg;
		int a[100],b[100];
		rep(i,n)cin>>a[i]>>b[i],a[i]--,b[i]--;
		for(int i=n-1;i>=0;i--){
			int x=msg[a[i]], y=msg[b[i]];
			x+=abs(a[i]-b[i]); while(x>'z')x-=26;
			y+=abs(a[i]-b[i]); while(y>'z')y-=26;
			msg[b[i]]=x; msg[a[i]]=y;
		}
		cout<<msg<<endl;
	}
	
	return 0;
}