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

cug1692 构造字符串

时间:2016-05-12 14:36:21      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:

题目大意:一个字符串有a,b组成,告诉你 a , b , ab ,ba 的数量S(a) , S(b) , S(ab) , S(ba),求字典序最小的字符串 , 无解输出-1。。


思路:首先若ab和ba的差大于1,则无解。其次,若S(a) <= S(ab) , S(ba)  且 S(b) <= S(ab) , S(ba) ,则无解。当S(ab) , S(ba)都为0但S(a)和S(b)都不为0则无解。


接下来就是构造了。

分为以下三块:

1、S(ab) > S(ba)  

这个简单,将所有的出去S(a)-S(ab)的a放到最前面,然后就是ab,最后将剩余的b放到最后面


2、S(ab) < S(ba)


这个有个小坑,若S(ab)为0,则将所有的b放到最前面,然后放ba,再放a

若S(ab)不为0,则将剩余的a放到第一个ba后面,然后放ba(留一个放最后),最后放b,然后ba即可


3、S(ab)<S(ba)


这个考虑的最多, 直接看代码吧。


#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <iomanip>

using namespace std;
//#pragma comment(linker, "/STACK:102400000,102400000")
#define maxn 200005
#define MOD 1000000007
#define mem(a , b) memset(a , b , sizeof(a))
#define LL long long
#define ULL unsigned long long
typedef pair<int , int> pii;
const long long INF=0x3fffffff;

int main()
{
    int na , nb , nab , nba , t;
    scanf("%d" , &t);
    while(t--)
    {
        scanf("%d %d %d %d" , &na , &nb , &nab , &nba) ;
        if(abs(nab - nba) > 1 || nab == nba && nab == 0 && na != 0 && nb != 0 || na < nab || na < nba || nb < nab || nb < nba)
        {
            printf("-1\n");
            continue;
        }
        if(na == nb && nb == nab && nab == nba)
        {
            printf("-1\n");
            continue;
        }
        if(nab > nba)
        {
            for(int i = 0 ; i < na - nab ; i ++) printf("a");
            for(int i = 0 ; i < nab ; i ++) printf("ab");
            for(int i = 0 ; i < nb - nab ; i ++) printf("b");
            printf("\n");
        }
        else if(nab == nba)
        {
            if(nb > nab  && na > nab)
            {
                for(int i = 0 ; i < na - nab - 1 ; i ++) printf("a");
                for(int i = 0 ; i < nab ; i ++) printf("ab");
                for(int i = 0 ; i < nb - nab - 1 ; i ++) printf("b");
                printf("ba");
                printf("\n");
            }
            else if(na > nab)
            {
                for(int i = 0 ; i < na - nab - 1 ; i ++) printf("a");
                for(int i = 0 ; i < nab ; i ++) printf("ab");
                printf("a");
                printf("\n");
            }
            else if(nb > nab)
            {
                printf("b");
                for(int i = 0 ; i < nab ; i ++) printf("ab");
                for(int i = 0 ; i < nb - nab - 1 ; i ++) printf("b");
                printf("\n");
            }

        }
        else
        {
            if(nab)
            {
                printf("ba");
                for(int i = 0 ; i < na - nba ; i ++) printf("a");
                for(int i = 0 ; i < nba - 2; i ++) printf("ba");
                for(int i = 0 ; i < nb - nba ; i ++) printf("b");
                printf("ba\n");
            }
            else
            {
                for(int i = 0 ; i < nb - nba ; i ++) printf("b");
                printf("ba");
                for(int i = 0 ; i < na - 1 ; i ++) printf("a");
                printf("\n");
            }
        }
    }
    return 0;
}


cug1692 构造字符串

标签:

原文地址:http://blog.csdn.net/qq_24477135/article/details/51366257

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