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










