牛客多校4.C.LCS 构造

Analysis

题目要求构造三个长度为牛客多校4.C.LCS 构造_i++​​的字符串牛客多校4.C.LCS 构造_最小值_02​​​,同时满足牛客多校4.C.LCS 构造_字符串_03

很容易想到,对于待构造的三个串,我们应该先选择最小的牛客多校4.C.LCS 构造_acm竞赛_04​​​​,将三个空串填充牛客多校4.C.LCS 构造_acm竞赛_04​个相同字母;然后将次小和最大的两个牛客多校4.C.LCS 构造_最小值_06​值减去已经填充的牛客多校4.C.LCS 构造_acm竞赛_04长度。此时三个牛客多校4.C.LCS 构造_最小值_06​​最小值一定为0,然后再选择非零最小值(就是前面的次小值),对两个串进行填充,再对剩下的另外一个牛客多校4.C.LCS 构造_最小值_06值对应的两个串进行填充。

那么对于样例:​​1 2 3 4​

首先对于三个空串填充最小值牛客多校4.C.LCS 构造_字符串_10

a
a
a

三个牛客多校4.C.LCS 构造_最小值_06值减去牛客多校4.C.LCS 构造_字符串_10后,为​​​0 1 2​​​,那么接下来对第二、三个串填充牛客多校4.C.LCS 构造_字符串_10牛客多校4.C.LCS 构造_i++_14,第三、一个串填充牛客多校4.C.LCS 构造_acm竞赛_15牛客多校4.C.LCS 构造_acm竞赛_16

acc
ab
abcc

剩余的均填充不同的字符即可。

accd
abee
abcc

这样便得到了一组合法的解。接下来考虑不合法的情况:填充超出给定长度牛客多校4.C.LCS 构造_i++

若首次填充的长度牛客多校4.C.LCS 构造_acm竞赛_04加上后面填充的长度牛客多校4.C.LCS 构造_算法_19牛客多校4.C.LCS 构造_最小值_20那么即为不合法的解。注意此处牛客多校4.C.LCS 构造_最小值_06是对输入三个值的升序排序。

AC Code

#include <bits/stdc++.h>
#define a aa[1]
#define b aa[2]
#define c aa[3]
using namespace std;

struct node{
int x;
string ans;
bool operator<(const node &xa){ return x < xa.x; }
};

int tot = 0;

signed main(){
node aa[4]; int n; cin >> a.x >> b.x >> c.x >> n;
sort(aa + 1, aa + 4);
if(b.x + c.x - a.x > n) return cout << "NO" << endl, 0;

for(int i = 0 ; i < a.x; i++) a.ans += 'a', b.ans += 'a', c.ans += 'a';
tot++;
for(int i = 0; i < b.x - a.x; i++) b.ans += 'a' + tot, c.ans += 'a' + tot;
tot++;
for(int i = 0; i < c.x - a.x; i++) c.ans += 'a' + tot, a.ans += 'a' + tot;
tot++;
for(int i = 1; i <= 3; i++){
while(aa[i].ans.length() < n) aa[i].ans += 'a' + tot;
tot++;
}
sort(aa + 1, aa + 4, cmp);
if(a.x >= b.x && b.x >= c.x) cout << c.ans << endl << a.ans << endl << b.ans << endl;
else if(a.x >= c.x && c.x >= b.x) cout << a.ans << endl << b.ans << endl << c.ans << endl;
else if(b.x >= a.x && a.x >= c.x) cout << a.ans << endl << b.ans << endl << c.ans << endl;
else if(b.x >= c.x && c.x >= a.x) cout << c.ans << endl << a.ans << endl << b.ans << endl;
else if(c.x >= a.x && a.x >= b.x) cout << c.ans << endl << a.ans << endl << b.ans << endl;
else if(c.x >= b.x && b.x >= a.x) cout << a.ans << endl << b.ans << endl << c.ans << endl;
return 0;
}