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; }