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

链接:https://ac.nowcoder.com/acm/contest/11255/C
在这里插入图片描述
思路:若A<=B<=C,则先三个串都加上A个’a’,然后s2和s3加上B-A个字母’b’,然后s1和s3加上C-A个字母’c’,就可以满足公共子序列个数的条件。之后在后面补’d’,‘e’,‘f’,直到长度到N。如果补之前长度超过N,就失败。
但是题目没有保证A<=B<=C,所以我们可以先建立映射关系,A映射s1,s2,B映射s2,s3,C映射s1,s3,所以我们可以将A,B,C重新排序后,按照映射关系进行操作,最后依此输出s1,s2,s3

#include <bits/stdc++.h>

using namespace std;
struct node{
    int first,second;
    int val;
}a[4];
string s[4];
int cmp(node x,node y){
    return x.val<y.val;
}
int main()
{
    //cout << "Hello world!" << endl;
    int A,B,C,N;
    cin>>A>>B>>C>>N;
    a[1].val=A,a[1].first=1,a[1].second=2;
    a[2].val=B,a[2].first=2,a[2].second=3;
    a[3].val=C,a[3].first=3,a[3].second=1;
    sort(a+1,a+3+1,cmp);
    for(int i=1;i<=a[1].val;i++){
        for(int j=1;j<=3;j++){
            s[j]+='a';
        }
    }
    for(int i=1;i<=a[2].val-a[1].val;i++){
        int id1=a[2].first,id2=a[2].second;
        s[id1]=s[id1]+'b',s[id2]=s[id2]+'b';
    }
    for(int i=1;i<=a[3].val-a[1].val;i++){
        int id1=a[3].first,id2=a[3].second;
        s[id1]+='c',s[id2]+='c';
    }
    int flag=1;
    for(int i=1;i<=3;i++){
        if(s[i].size()>N)flag=0;
        for(int j=s[i].size();j<N;j++){
            s[i]+='d'+i;
        }
    }
    if(flag==0){
        cout<<"NO"<<endl;
        return 0;
    }
    for(int i=1;i<=3;i++){
        cout<<s[i]<<endl;
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值