给两个字符串S1 S2 ,以S2首字符开始两个字符串交替穿插可得S12,然后把S12前半部分划为S1,后半部分划为S2,可重新执行操作,求经过多少步可得字符串D。
直接模拟,用map记录已经出现的字符串。
#include<cstdio>
#include<queue>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
const int INF=0x3f3f3f3f,MAXN=1000000000+7;
int vis[10000],mod[1000000],cnt,row[15],m,n,ans=-1;
typedef long long LL;
map<string,int> S;
int main(){
scanf("%d",&n);
for (int i=0;i<n;i++){
int len;
scanf("%d",&len);
string a,b,c,D;
cin>>a>>b>>D;
for (int i=0;i<len;i++){
c+=b[i],c+=a[i];
}
int ans=0;
while (1){
ans++;
if (S.count(c)){
ans=-1;break;
}
if (c==D) break;
S[c]=1;
a=c.substr(0,len);
b=c.substr(len,len);
c.clear();
for (int i=0;i<len;i++){
c+=b[i],c+=a[i];
}
}
printf("%d %d\n",i+1,ans);
}
}