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


以上是关于POJ-3087的主要内容,如果未能解决你的问题,请参考以下文章

POJ3087:Shuffle'm Up

POJ 3087Shuffle'm Up

Poj3087

poj 3087

poj-3087 Shuffle'm Up

POJ-3087