思路:
三个字符串中共有的子串长度一定为min(a,b,c),然后用类似于容斥的方法即可。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <utility>
#include <vector>
#include <string>
#include <vector>
#include <queue>
#include <map>
#define INF 999999999
using namespace std;
typedef long long ll;
int a[5],z[5];
int n;
int main()
{
cin>>a[1]>>a[2]>>a[3]>>n;
int amin=min(a[1],min(a[2],a[3]));
z[4]=amin;
z[1]=a[1]-amin; z[2]=a[2]-amin; z[3]=a[3]-amin;
for(int i=1;i<=3;i++)
{
if(z[i]+z[(i)%3+1]+amin > n)
{
cout<<"NO"<<endl;
return 0;
}
}
for(int i=1;i<=3;i++)
{
int cnt=0;
cnt+=z[4];
for(int j=1;j<=z[4];j++)
{
cout<<'g';
}
if(i == 1 || i == 2)
{
cnt+=z[1];
for(int j=1;j<=z[1];j++)
{
cout<<(char)('d');
}
}
if(i == 2 || i == 3)
{
cnt+=z[2];
for(int j=1;j<=z[2];j++)
{
cout<<(char)('e');
}
}
if(i == 1 || i == 3)
{
cnt+=z[3];
for(int j=1;j<=z[3];j++)
{
cout<<(char)('f');
}
}
for(int j=1;j<=n-cnt;j++) cout<<(char)('a'+i-1);
cout<<endl;
}
}