您的位置:首页 > 其它

B. ZgukistringZ-简单字符串处理-Codeforces Round #307 (Div. 2)

2015-08-07 19:24 387 查看
题意:

给出a,b,c三个字符串

可以随意打乱a的顺序,看能构造出最多几个b或c

统计一下a的每个字母的个数,然后对比一下bc就好

#include <cstring>
#include <string>
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <queue>
#include <map>
#include <set>
#include <vector>
#define inf 0x3f3f3f3f
using namespace std;
char a[100000+5];
char b[100000+5];
char c[100000+5];
int vis3[26+5];
int vis1[26+5];
int vis2[26+5];
int cal1[26+5];
int cal2[26+5];

int ch(int x)
{
	int i;
	if (x==1)
	{
		for (i=1;i<=26;i++)
		{
			if (vis1[i]<vis2[i])
			{
				return 0;
			}
		}
	}
	else
		if (x==2)
		{
			for (i=1;i<=26;i++)
			{
				if (vis1[i]<vis3[i])
				{
					return 0;
				}
			}
		}
		
		return 1;
		
}

int main()
{
	int i,j,n;
	scanf("%s",&a);
	scanf("%s",&b);
	scanf("%s",&c);
	for (i=0;i<strlen(a);i++)
		vis1[a[i]-'a'+1]++;
	for (i=0;i<strlen(b);i++)
		vis2[b[i]-'a'+1]++;
	for (i=0;i<strlen(c);i++)
		vis3[c[i]-'a'+1]++;
	
	int min1=inf;
	int min2=inf;
	for (i=1;i<=26;i++)
	{ 
			if (vis1[i]&&vis2[i])
			{
				cal1[i]=vis1[i]/vis2[i];
				if (cal1[i]<min1) min1=cal1[i];
			}
			if (vis1[i]==0&&vis2[i]) {min1=0;break;}
	}
	
	int num=min1;		//选取min1个b
	for (i=1;i<=26;i++)
	{ 
			if (vis1[i]&&vis2[i] )
				vis1[i]-=vis2[i]*min1;//去掉min1个b
	}
	for (i=1;i<=26;i++)
	{   	
		if (vis1[i]&&vis3[i])
		{
			cal2[i]=vis1[i]/vis3[i];		//还能买几个c
		if (cal2[i]<min2) min2=cal2[i];
		}
		if (vis1[i]==0&&vis3[i]) {min2=0;break;}
		
	}
	if (min2==inf)
		min2=0;
	num+=min2;		//选取min2个c
	for (i=1;i<=26;i++)
	{ 
		vis1[i]-=vis3[i]*min2;//去掉min2个c
	}
	int num2=num;
	int min2_best=min2;
	for (j=1;j<=min1;j++)		//每次去掉一个b
	{
		
		num2--;
		for (i=1;i<=26;i++)
		{ 
			vis1[i]+=vis2[i];//加个b的元素
		}
		while (ch(2))  //如果能选c
		{
			num2++;
			min2++;
			for (i=1;i<=26;i++)
			{ 
				vis1[i]-=vis3[i];//减个c的元素
			}
		}
		if (num2>num)
		{
			num=num2;
			min2_best=min2;
		}
	}
	memset(vis1,0,sizeof(vis1));
	for (i=0;i<strlen(a);i++)
		vis1[a[i]-'a'+1]++;
		min1=num-min2_best;
		for (i=1;i<=26;i++)
		{
			vis1[i]-=(vis2[i]*min1+vis3[i]*min2_best);
		}
		for (i=1;i<=min1;i++)
			printf("%s",b);
	for (i=1;i<=min2_best;i++)
			printf("%s",c);
	for(i=1;i<=26;i++)
	{
		while (vis1[i])
		{
			printf("%c",'a'+i-1);
			vis1[i]--;
		}
	}

 
	
	
	
	
	cout<<endl;
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: