题意:首先设定一次转换,即图中 s1 和 s2 组成的 s12 ,下一轮 s12 的前半部分又成为了新的 s1,后半部分又成为了新的 s2;
现在给出 原始的 s1 和 s2 以及目标的 s12,问得经过多少轮转换之后,才可以 s1 和 s2 才可以组成目标的 s12,若永远不能则输出-1;
分析:暴力模拟转换过程就行了,用string操作会比较方便,然后用 set 记录中间达到过的s12的状态;
代码:
#include<set>
#include<string>
#include<cstdio>
#include<iostream>
using namespace std;
string s1,s2,s12;
int m;;
set<string>st;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int q;
cin>>q;
for(int cas=1;cas<=q;cas++){
int count=1;
cin>>m;
cin>>s1>>s2>>s12;
while(1){
string s;
for(int i=0;i<m;i++){
s.push_back(s2[i]);
s.push_back(s1[i]);
}
if(s==s12){
cout<<cas<<' '<<count<<'\n';
break;
}
if(st.find(s)==st.end()){
st.insert(s);
}
else{
cout<<cas<<' '<<-1<<'\n';
break;
}
s1.assign(s.begin(),s.begin()+m);
s2.assign(s.begin()+m,s.end());
count++;
}
st.clear();
}
}