码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces 551B: Zguki stringZ

时间:2015-07-16 16:46:39      阅读:102      评论:0      收藏:0      [点我收藏+]

标签:codeforces

题意:给你3个字符串a,b,c(均由小写英文字母构成),要求移动字符串a里面字母的位置,使得a字符串里b,c出现的总次数最多,并且重叠部分不算在内。

思路:先枚举其中一个字串(b或c)在a中出现的次数,然后计算对应情况下,另一字串出现的次数,保留最大的那个总次数和即可。

代码如下:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e5+10;
int len1, len2, len3;
char a[N], b[N], c[N];
int h1[30],h2[30], h3[30];
int cnt, cnt2, cnt3;

bool cmp(int a, int b)
{
	return a > b;
}

int main()
{
	while(~scanf("%s%s%s", &a, &b, &c))
	{
		getchar();
		len1 = strlen(a);
		len2 = strlen(b);
		len3 = strlen(c);
		for(int i = 0; i < len1; i++)
		{
			h1[a[i]-'a'] ++;
		}
		for(int i = 0; i < len2; i++)
		{
			h2[b[i]-'a'] ++;
		}
		for(int i = 0; i < len3; i++)
		{
			h3[c[i]-'a'] ++;
		}
		cnt = 0;  
       for(int i=1; ; i++)  
        {  
            int p = N;  
            for(int j = 0; j < 26; j++)  
            {  
                if(h1[j]-h2[j]*i<0)  
                {  
                    p=0;  
                    break;  
                }  
            }  
            if(!p) break;  
            int p2 = N;  
            for(int j = 0; j < 26; j++)  
            {  
                if(h3[j])  
                {  
                    p2 = min(p2, (h1[j] - h2[j] * i) / h3[j]);  
                }  
            }  
            if(i+p2>cnt)  
            {  
                cnt = i+p2;  
                cnt2 = i;  
                cnt3 = p2;  
            }  
        }  
        for(int i=1;; i++)  
        {  
            int p = N;  
            for(int j = 0; j < 26; j++)  
            {  
                if(h1[j]-h3[j] * i < 0)  
                {  
                    p=0;  
                    break;  
                }  
            }  
            if(!p) break;  
            int p2 = N;  
            for(int j = 0; j < 26; j++)  
            {  
                if(h2[j])  
                {  
                    p2 = min(p2, (h1[j] - h3[j] * i) / h2[j]);  
                }  
            }  
            if(i + p2 > cnt)  
            {  
                cnt = i+p2;  
                cnt3 = i;  
                cnt2 = p2;  
            }  
        }  
        for(int i = 0; i < cnt2; i++)  
            printf("%s", b);  
        for(int i = 0; i < cnt3; i++)  
            printf("%s", c);  
        for(int i = 0; i < 26; i++)  
        {  
            for(int j = 0; j < h1[i] - cnt2 * h2[i] - cnt3 * h3[i]; j++)  
                printf("%c",i+'a');  
        }  
        printf("\n");  
    }  
	return 0;
} 


版权声明:本文为博主原创文章,未经博主允许不得转载。

Codeforces 551B: Zguki stringZ

标签:codeforces

原文地址:http://blog.csdn.net/doris1104/article/details/46911739

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!