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;

}

  

你可能感兴趣的:(shuffle)