思路:
首先我们将
a
,
b
,
c
a,b,c
a,b,c进行排序找到最小值,下面我们假设
c
c
c为最小值,我们首先给三个字符串分别加上
c
c
c个
‘
a
’
‘a’
‘a’。
其次,我们就对
s
1
,
s
2
s1,s2
s1,s2分别加上
a
−
c
a-c
a−c个
‘
b
’
‘b’
‘b’,对
s
2
,
s
3
s2,s3
s2,s3分别加上
b
−
c
b-c
b−c个
‘
c
’
‘c’
‘c’至此我们三个字符串所有相同的部分就构造完了,而各个字符串也有了长度分别为:
s
1
=
c
+
a
−
c
s1=c+a-c
s1=c+a−c
s
2
=
c
+
a
−
c
+
b
−
c
s2=c+a-c+b-c
s2=c+a−c+b−c
s
3
=
c
+
b
−
c
s3=c+b-c
s3=c+b−c
显然
s
1
s1
s1,与
s
3
s3
s3是符合的,其长度一定小于
n
n
n,所以我们得出来无解的条件,也就是
c
+
a
−
c
+
b
−
c
>
n
c+a-c+b-c>n
c+a−c+b−c>n即
a
+
b
−
c
>
n
a+b-c>n
a+b−c>n
三个字符串剩下不够长度n的取不同字符构造即可。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<map>
#include<cstdio>
#include<cmath>
#include<iomanip>
#include<sstream>
#include<queue>
#define fr for
#define pi 3.1415926535
#define me(a,b,c) memset(a,b,sizeof c)
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
typedef pair<int, int> pii;
const int N = 1e6 + 10;
string s1, s2, s3;
int main() {
int a, b, c, n;
cin >> a >> b >> c >> n;
int h = min({ a,b,c });
a -= h, b -= h, c -= h;
if (a + b + h + c > n) {//小小变换一下
puts("NO");
return 0;
}
while (h--)s1 += 'a', s2 += 'a', s3 += 'a';
while (a--) {
s1 += 'b'; s2 += 'b';
}
while (b--)
{
s2 += 'c', s3 += 'c';
}
while (c--)
{
s1 += 'd', s3 += 'd';
}
while (s1.size() < n)s1 += 'e';
while (s2.size() < n)s2 += 'f';
while (s3.size() < n)s3 += 'g';
cout << s1 << endl << s2 << endl << s3 << endl;
}