补题链接: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;
}










