0
点赞
收藏
分享

微信扫一扫

2021牛客暑期多校训练营4 - C(LCS)

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

#include<iostream>

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;
}


举报

相关推荐

0 条评论