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
原创粉丝点击