本题就直接模拟就OK啦,停止有2个条件,一个条件是达到目的串,另一个条件就是S1经过多次模拟又回到原始串。
题意不太好懂。那我就说一下吧。
就是经过shuffle,split,两个步骤,不断的进行这两个步骤,知道出现可以触发停止的条件位置。
1 #include <iostream> 2 #include <string> 3 #include <string.h> 4 #include <stdio.h> 5 using namespace std; 6 int l; 7 void split(string &t1,string &t2,string t) 8 { 9 int i,j; 10 for(i=0;i<l;++i) 11 { 12 t1[i]=t[i]; 13 } 14 for(i=0,j=l;i<l;++i,++j) 15 { 16 t2[i]=t[j]; 17 } 18 return ; 19 } 20 void shuffle(string t1,string t2,string &t) 21 { 22 int i,j; 23 for(i=0,j=0;i<2*l;i=i+2,j++) 24 t[i]=t2[j]; 25 for(i=1,j=0;i<2*l;i=i+2,j++) 26 t[i]=t1[j]; 27 return ; 28 } 29 int main() 30 { 31 int tt; 32 int k; 33 int cnt; 34 string aim,bt1,bt2; 35 string t1,t2,t; 36 bool success; 37 bool sign; 38 while(cin>>tt) 39 { 40 for(k=1;k<=tt;++k) 41 { 42 cnt=0; 43 cin>>l; 44 cin>>bt1>>bt2>>aim; 45 success=0; 46 t1=bt1; 47 t2=bt2; 48 t=bt1+bt2; 49 sign=0; 50 while(1) 51 { 52 cnt++; 53 if(t1==bt1&&sign==1) 54 break; 55 sign=1; 56 shuffle(t1,t2,t); 57 if(t==aim) 58 { 59 success=1; 60 break; 61 } 62 split(t1,t2,t); 63 64 } 65 cout<<k<<" "; 66 if(success==0) 67 cout<<-1<<endl; 68 else 69 cout<<cnt<<endl; 70 } 71 } 72 return 0; 73 }