C. LCS
分析:
三个串,每两个串之间都有公共子串,最优解决方案让三个共有的尽量多,所以先找到最小的LCS(), 再依次根据三个 lcs 添加字符。
Code:
#include <bits/stdc++.h>
using namespace std;
const int N = 1005;
char st[N], sr[N], ss[N];
signed main()
{
int a, b, c, n;
cin>>a>>b>>c>>n;
int mn = min(a, min(b,c));
if(a+b+c-2*mn > n)
{
cout<<"NO"<<endl;
return 0;
}
int ct=0, cr=0, cs=0;
for(int i=1;i<=mn;i++)
{
st[++ct] = 'a'; sr[++cr] = 'a'; ss[++cs] = 'a';
}
for(int i=1;i<=a-mn;i++)
{
st[++ct] = 'b'; sr[++cr] = 'b';
}
for(int i=1;i<=b-mn;i++)
{
sr[++cr] = 'c'; ss[++cs] = 'c';
}
for(int i=1;i<=c-mn;i++)
{
st[++ct] = 'd'; ss[++cs] = 'd';
}
while(ct < n) st[++ct] = 'e';
while(cr < n) sr[++cr] = 'f';
while(cs < n) ss[++cs] = 'g';
for(int i=1;i<=n;i++) cout<<st[i];
cout<<endl;
for(int i=1;i<=n;i++) cout<<sr[i];
cout<<endl;
for(int i=1;i<=n;i++) cout<<ss[i];
cout<<endl;
return 0;
}