码迷,mamicode.com
首页 > 其他好文 > 详细

POJ-3087

时间:2019-08-28 10:44:04      阅读:82      评论:0      收藏:0      [点我收藏+]

标签: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;
}

原文:大专栏  POJ-3087


POJ-3087

标签:oca   const   stream   names   std   cout   mes   ons   else   

原文地址:https://www.cnblogs.com/petewell/p/11422258.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!