POJ 3087 Shuffle'm Up
模拟。
就把洗牌的过程模拟一下,开一个$map$记录一下某状态是否出现过,如果之前出现过,就意味着无解。
#pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #include<map> #include<set> #include<queue> #include<stack> #include<iostream> using namespace std; typedef long long LL; const double pi=acos(-1.0),eps=1e-8; void File() { freopen("D:\\in.txt","r",stdin); freopen("D:\\out.txt","w",stdout); } int T,n; char s1[400],s2[400],t[400],s[400]; int main() { scanf("%d",&T); int cas=1; while(T--) { scanf("%d",&n); map<string,bool>f; memset(s,0,sizeof s); memset(t,0,sizeof t); scanf("%s%s",s1,s2); scanf("%s",s); int ans=0; while(1) { for(int i=0;i<n;i++) t[2*i]=s2[i], t[2*i+1]=s1[i]; ans++; if(strcmp(s,t)==0) break; if(f[t]==0) { f[t]=1; for(int i=0;i<n;i++) s1[i]=t[i]; for(int i=n;i<2*n;i++) s2[i-n]=t[i]; } else {ans=-1; break;} } printf("%d %d\n",cas++,ans); } return 0; }