cf307_B
来源:互联网 发布:mac 破解版软件网站 编辑:程序博客网 时间:2024/05/16 19:35
此题不难,但是刚开始想的比较复杂,想法有还是比较好写的。我们枚举字符串b出现的次数(0<=num<=strlen(a)),然后可以知道字符串c最多可以出现几次,边枚举边记录最大的次数和b,c各自出现的次数,最后输出即可。
#include<stdio.h>#include<iostream>#include<string>#include<string.h>#include<algorithm>#include<iomanip>#include<vector>#include<time.h>#include<queue>#include<stack>#include<iterator>#include<math.h>#include<stdlib.h>#include<limits.h>#include<map>//#define ONLINE_JUDGE#define eps 1e-10#define INF 0x7fffffff#define FOR(i,a) for((i)=0;i<(a);(i)++)#define MEM(a) (memset((a),0,sizeof(a)))#define sfs(a) scanf("%s",a)#define sf(a) scanf("%d",&a)#define sfI(a) scanf("%I64d",&a)#define pf(a) printf("%d\n",a)#define pfI(a) printf("%I64d\n",a)#define pfs(a) printf("%s\n",a)#define sfd(a,b) scanf("%d%d",&a,&b)#define sft(a,b,c)scanf("%d%d%d",&a,&b,&c)#define for1(i,a,b) for(int i=(a);i<b;i++)#define for2(i,a,b) for(int i=(a);i<=b;i++)#define for3(i,a,b)for(int i=(b);i>=a;i--)#define MEM1(a) memset(a,0,sizeof(a))#define MEM2(a) memset(a,-1,sizeof(a))#define ll __int64const double PI=acos(-1.0);template<class T> T gcd(T a,T b){return b?gcd(b,a%b):a;}template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}template<class T> inline T Min(T a,T b){return a<b?a:b;}template<class T> inline T Max(T a,T b){return a>b?a:b;}using namespace std;int n,m,k;int s;#define N 100010char a[N],b[N],c[N];int na[35],nb[35],nc[35];int main(){#ifndef ONLINE_JUDGE freopen("in.txt","r",stdin);// freopen("out.txt","w",stdout);#endif while(scanf("%s%s%s",a,b,c)!=EOF){ int len = strlen(a); int len1 = strlen(b); int len2 = strlen(c); memset(na,0,sizeof na); memset(nb,0,sizeof nb); memset(nc,0,sizeof nc); for(int i=0;i<len;i++) na[a[i]-'a']++; for(int i=0;i<len1;i++) nb[b[i]-'a']++; for(int i=0;i<len2;i++) nc[c[i]-'a']++; int mmax = -1; int bnum=0,cnum=0; for(int i=0;i<=len;i++){ //枚举b字符串出现的次数 int tmp[45]; int num=0; for(int j=0;j<30;j++) tmp[j] = na[j]; int flag = 1; for(int j=0;j<30;j++){ //统计a字符串在b字符串出现i次后,各字母还剩多少个 tmp[j] -= (nb[j])*i; if(tmp[j]<0) flag = 0; } if(!flag) break; num += i; //i就是b字符串出现的次数 int ctmp = INF; for(int j=0;j<30;j++){ if(nc[j]!=0) ctmp = Min(ctmp,tmp[j]/nc[j]);//看c字符串在a中最多能够出现几次 } num += ctmp; //ctmp就是c字符串出现的最大次数 if(num>mmax){ mmax = num; bnum = i; cnum = ctmp; } } for(int i=0;i<bnum;i++) printf("%s",b); for(int i=0;i<cnum;i++) printf("%s",c); for(int i=0;i<30;i++) na[i] -= (nb[i])*bnum; for(int i=0;i<30;i++) na[i] -= (nc[i])*cnum; for(int i=0;i<30;i++){ while(na[i]>0){ printf("%c",'a'+i); na[i]--; } } printf("\n"); }return 0;}
0 0