补题链接:https://ac.nowcoder.com/acm/contest/11255/C
题中给出LCS(s1, s2) = a,LCS(s2, s3) = b,LCS(s1, s3) = c;
可以将mi = min(a, b, c)
长度作为s1
, s2
, s3
的公共部分,然后a -= mi
, b -= mi
, c -= mi
,此时(a, b, c
)有一个为0
,而要满足构造的字符串的最小
长度为此时的 mi + a + b + c
,如果n < mi + a + b + c
,则不满足条件。对于s1
,s2
, s3
,首先都填充mi
长度的'q'
字符,然后对于s1
,s2
填充减掉mi
后的a
长度的'a'
字符,对于s2
,s3
填充减掉mi
后的b
长度的'b'
字符,对于s1
,s3
填充减掉mi
后的c
长度的'c'
字符,然后对于s1
,s2
,s3
中长度没有到达n
长度的部分,分别填充'x'
,'y'
,'z'
字符。
AC code
using namespace std;
int a, b, c, n, mi;
int main(){
scanf("%d%d%d%d", &a, &b, &c, &n);
mi = min(a, b);
mi = min(mi, c);
a -= mi, b -= mi, c -= mi; // 有一个为减为0
string s1 = "", s2 = "", s3 = "";
// 此时的a + b + c + mi 是字符串的最小长度
// 只有n >= x才满足
if(a + b + c + mi > n){
puts("NO");
return 0;
}
for(int i = 1; i <= mi; i++){
s1.push_back('q');
s2.push_back('q');
s3.push_back('q');
}
for(int i = 1; i <= a; i++){
s1.push_back('a');
s2.push_back('a');
}
for(int i = 1; i <= b; i++){
s2.push_back('b');
s3.push_back('b');
}
for(int i = 1; i <= c; i++){
s1.push_back('c');
s3.push_back('c');
}
// 不够n的字符串补到n长度
for(int i = s1.length(); i < n; i++){
s1.push_back('x');
}
for(int i = s2.length(); i < n; i++){
s2.push_back('y');
}
for(int i = s3.length(); i < n; i++){
s3.push_back('z');
}
puts(s1.c_str());
puts(s2.c_str());
puts(s3.c_str());
return 0;
}