标签:
题目大意:一个字符串有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; }
标签:
原文地址:http://blog.csdn.net/qq_24477135/article/details/51366257