POJ-3087
Posted petewell
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ-3087相关的知识,希望对你有一定的参考价值。
题目描述
给定两个长为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;
以上是关于POJ-3087的主要内容,如果未能解决你的问题,请参考以下文章