构造字符串s1,s2,s3使得LCS(s1,s2)=a,LCS(s2,s3)=b,LCS(s3,s1)=c
我们先令minn为a,b,c三者中最小的,将s1,s2,s3用字符'a'填充至minn长度
然后再依次满足a,b,c三种条件,分别用字符'b''c''d'填充a-minn,b-minn,c-minn次
此时消耗最少字符满足上述三种条件,如果此时的s1,s2,s3中有一个长度超过了n,那么三种字符串不可能被构造,输出NO
然后随便使用三种不同的字符填充s1,s2,s3剩余空位至n即可
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #include<queue> using namespace std; int a,b,c,n; int minn=0x3f3f3f3f; char s1[10010]; char s2[10010]; char s3[10010]; int len1,len2,len3; int main(){ scanf("%d%d%d%d",&a,&b,&c,&n); minn=min(c,min(a,b)); for(int i=1;i<=minn;i++) { s1[++len1]='a'; s2[++len2]='a'; s3[++len3]='a'; } for(int i=1;i<=(a-minn);i++) { s1[++len1]='b'; s2[++len2]='b'; } for(int i=1;i<=(b-minn);i++) { s2[++len2]='c'; s3[++len3]='c'; } for(int i=1;i<=(c-minn);i++) { s3[++len3]='d'; s1[++len1]='d'; } while(len1<n) { s1[++len1]='x'; } while(len2<n) { s2[++len2]='y'; } while(len3<n) { s3[++len3]='z'; } if(len1==n&&len2==n&&len3==n) { cout<<s1+1<<endl<<s2+1<<endl<<s3+1<<endl; } else cout<<"NO"; return 0; }