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

C-LCS

题目

链接:https://ac.nowcoder.com/acm/contest/11255/C
来源:牛客网
题目大意是输入4个数分别是a,b,c,n,问有没有三个长度为n的且只有小写字母的字符串s1,s2,s3满足s1和s2,s2和s3,s1和s3的最长公共子序列的长度分别为a,b,c.如果有解就输出它们(输出结果不唯一),否则输出"NO".
样例输入1:
1 2 3 4
样例输出1:
aqcc
abpp
abcc

样例输入2:
1 2 3 3
样例输出2:
NO

思路

我们先不管s1,s2,s3的长度,直接寻找最短的满足条件的s1,s2,s3.通过简单的推理(试几组样例)就能发现规律.先找出a,b,c中的最小值len,即三个字符串的公共子序列的长度并把这三个字符串都加上len个’a’,由于s1,s2的公共子序列长度为a,所以我们对s1,s2直接加上a个’a’,接着给s1和s3加上c-len个’b’,然后给s2和s3加上b-len个’c’,三个字符串就构造好了,然后判断s1,s2,s3中有没有字符串的长度大于n,如果大于的话直接输出"NO",否则在s1,s2,s3后面分别补上’x’,‘y’,'z’直到它们的长度都为n然后输出.(加上的字符只要不同即可)

代码实现

#include<bits/stdc++.h>
using namespace std;
int a,b,c,n,len;
string s1,s2,s3;
int main(){
	cin>>a>>b>>c>>n;
	len=min(min(a,b),c);
	s1=string(a,'a')+string(c-len,'b');
	s2=string(a,'a')+string(b-len,'c');
	s3=string(len,'a')+string(c-len,'b')+string(b-len,'c');
	if(s1.length()>n||s2.length()>n||s3.length()>n){
		cout<<"NO"<<endl;
	}
	else {
		s1+=string(n-s1.length(),'x');
		s2+=string(n-s2.length(),'y');
		s3+=string(n-s3.length(),'z');
		cout<<s1<<endl<<s2<<endl<<s3<<endl;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值