题目大意:一个字符串有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;
}