题意:
给定两个长度为len的字符串s1和s2, 接着给出一个长度为len*2的字符串s12。
将字符串s1和s2通过一定的变换变成s12,找到变换次数
变换规则如下:
假设s1=12345,s2=67890
变换后的序列 s=6172839405
如果s和s12完全相等那么输出变换次数
如果不完全相等,s的前半部分作为s1,后半部分作为s2,重复上述过程。
思路:按题意模拟就行了,没什么难度。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
const int maxn=200005;
const double eps=1e-8;
const double PI = acos(-1.0);
int len,flag=0;
map<string,int> mp;
string s12;
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(0);
std::cout.tie(0);
int t,cas=0;
cin>>t;
while(t--)
{
flag=0;
mp.clear();
cin>>len;
string s1,s2;
cin>>s1>>s2>>s12;
string tmp="";
for(int i=0; i<len; i++)
{
tmp=tmp+s2[i]+s1[i];
}
cout<<++cas<<" ";
int time=1;
mp[tmp]=1;
// cout<<tmp<<endl;
while(tmp.compare(s12)!=0)
{
for(int i=0; i<len; i++)
{
s1[i]=tmp[i];
}
for(int i=len; i<2*len; i++)
{
s2[i-len]=tmp[i];
}
int g=0;
for(int i=0;i<2*len;i+=2)
{
tmp[i]=s2[g];
tmp[i+1]=s1[g++];
}
// cout<<tmp<<endl;
if(mp[tmp]==1)
{
cout<<-1<<endl;
flag=1;
break;
}
mp[tmp]=1;
time++;
}
if(!flag)
{
cout<<time<<endl;
}
}
return 0;
}