3087 Shuffle'm Up
問題概要
チップの山S1,S2を、S2の最も下のチップを取り、新たな山S12に置く。
S1の最も下のチップを取り、S12の一番上に置く。
S2の最も下のチップを……と繰り返して山S12を作る。
山S12が目標の配列ならばシャッフルは終了で、そうでないならS12の下半分を新たなS1,上半分を新たなS2として同じ操作を繰り返す。
最初のS1,S2が与えられたとき、目標の配列を得るまでにかかるシャッフルの回数を求めよ。
ただし、山は下のチップから順に与えられる。
チップの枚数は1000以下である。
解法
山は下にあるチップが先頭になるとかいう罠が。
問題文で言われた通りのシャッフルを愚直にシミュレートして間に合う。
シャッフル後、今までと同じ配列に戻ったらループしているので-1を出力。
ソースコード
int main() { int n,T,ans; cin>>T; rep(U,T){ string s,t,g; cin>>n>>s>>t>>g; set<string> S; ans=1; for(;;ans++){ string u(2*n,' '); rep(i,n)u[i*2]=t[i],u[i*2+1]=s[i]; if(u==g)break; if(S.count(u)){ ans=-1; break; } S.insert(u); t=u.substr(n); s=u.substr(0,n); } cout<<U+1<<" "<<ans<<endl; } return 0; }