POJ 3087 Shuffle'm Up 线性同余,暴力 难度:2
http://poj.org/problem?id=3087
设:s1={A1,A2,A3,...Ac}
s2={Ac+1,Ac+2,Ac+3,....A2c}
则
合在一起成为
Ac+1,A1,Ac+2,A2......A2c,Ac
经过一次转换之后变成
s1={Ac+1,A1,Ac+2.....}
s2={...A2c,Ac}
对应之前,每个数的序号发生的变化是
+1,+2,+3....-c,-c+1,.....
把整个数链想成环,也相当于是:
+1,+2,+3....+c,+c+1,.......
例如A1,由A1->A2->A4->A7....c次之后必然回到A1
所以整个串经过一定次数的变换一定会回到最初状态,只需判断在回到最初状态之前有没有得到目标状态即可
#include <cstdio>//a=(a+c+1)%(2*c) #include <cstring> using namespace std; const int maxn=1002; int c; char s1[maxn],s2[maxn],aim[maxn],org[maxn],tmp[maxn]; void shuffle(){ for(int i=0;i<c;i++){ tmp[2*i]=s2[i]; tmp[2*i+1]=s1[i]; } tmp[2*c]=0; } int main(){ int T; scanf("%d",&T); for(int ti=1;ti<=T;ti++){ scanf("%d%s%s%s",&c,s1,s2,aim); shuffle(); strcpy(org,tmp); int ans=1; if(strcmp(tmp,aim)==0){ printf("%d 1\n",ti); continue; } bool fl=false; while(strcmp(org,tmp)!=0||ans==1){ strncpy(s1,tmp,c); strncpy(s2,tmp+c,c); shuffle(); ans++; if(strcmp(tmp,aim)==0){ fl=true; printf("%d %d\n",ti,ans); break; } } if(!fl)printf("%d -1\n",ti); } return 0; }