标签:oca const stream names std cout mes ons else
给定两个长为len的字符串s、t和长为2*len的串g,问是否存在按制定规则组合s、t得到g,如果s,t不能组成g,则将g的前后半部分分别赋予s、t,重复以上过程。如果可以得到,这输出变换步长,如果不能,则输出-1.
暴力就完事了,注意判重
#include<map>
#include<queue>
#include<cmath>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define LOCAL
#define cls ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define Mod 998244353
#define ll long long int
#define mset(a,b) memset(a,b,sizeof(a))
#define INF 1e9
const int maxn=105;
int len=0;
string s,t,g;
bool check(string &x){//由x y能否组成g
for(int i=0;i<(len<<1);i++){
if(x[i]!=g[i]) return false;
}
return true;
}
int work(){
int ans=1;
string x,y;
string ss;
map <string ,int >m;
cin>>len;
cin>>s>>t>>g;
x.resize(len);
y.resize(len);
ss.resize(2*len);
for(int i=0;i<len;i++) x[i]=s[i];
for(int i=0;i<len;i++) y[i]=t[i];
for(int i=0;i<len;i++){
ss[i<<1]=y[i];
ss[i<<1|1]=x[i];
}
m[ss]=1;
while(!check(ss)){
ans++;
for(int i=0;i<len;i++){//各取前后半部分
x[i]=ss[i];
y[i]=ss[len+i];
}
for(int i=0;i<len;i++){//如果没有出现过,则组成新的串
ss[i<<1]=y[i];
ss[i<<1|1]=x[i];
}
if(m[ss]) return -1;
else m[ss]=1;
}
return ans;
}
int main() {
cls;
#ifdef LOCAL
freopen("in.in","r",stdin);
#endif // LOCAL
int t;
cin>>t;
for(int i=1;i<=t;i++){
cout<<i<<" "<<work()<<endl;
}
return 0;
}
标签:oca const stream names std cout mes ons else
原文地址:https://www.cnblogs.com/petewell/p/11422258.html