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
",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
",ti,ans);
                                break;
                        }
                }
                if(!fl)printf("%d -1
",ti);
        }
        return 0;
}

  

原文地址:https://www.cnblogs.com/xuesu/p/4338159.html