湖南多校对抗赛(D-D)

#include<iostream>
/*
题意:有3个只包含大写字母的字符串A,B,C。问能不能从
      从A,B中分别拿出N/2个字符组成C串。(N为A的长度)。
解法:直接统计26个大写字母在A,B,C串中出现的个数,
	  当C串中出现字母时,则看A,B串中这个字母出现的
	  次数之和(A,B这个字母最多为N/2)是否大于C对应
	  的个数,否则不能从A,B中拿出N/2个字符凑成C。
*/
#include<cstring>
using namespace std;
const int MAXN=100005*2;
char a[MAXN],b[MAXN],c[MAXN];//ABC串
int Achar[26],Bchar[26],Cchar[26];
//ABC串中26个字母出现的次数
int lena,lenb,lenc,n;//ABC的长度
int main()
{
	while(cin>>a)
	{
		bool k=true;
		cin>>b;
		cin>>c;
		lena=strlen(a);
		lenb=strlen(b);
		lenc=strlen(c);
		n=lena/2;
		memset(Achar,0,sizeof(Achar));
		memset(Bchar,0,sizeof(Bchar));
		memset(Cchar,0,sizeof(Cchar));
		for(int i=0;i<lena;i++)//对应字母出现的次数+1
		{
			Achar[a[i]-'A']++;
		}
		for(int i=0;i<lenb;i++)//对应字母出现的次数+1
		{
			Bchar[b[i]-'A']++;
		}
		for(int i=0;i<lenc;i++)//对应字母出现的次数+1
		{
			Cchar[c[i]-'A']++;
		}
		for(int i=0;i<26;i++)
		{
			if(!k)
			{
				break;
			}
			if(Cchar[i])
			{
				if(Bchar[i]+Achar[i]<Cchar[i])//AB对应的字母个数
				{                       //之和比C的要小,即拿出AB的全部个数都不能凑成
					k=false;           //C串,则为NO
					break;
				}
				int numa,numb;
				numa=Achar[i]>n?n:Achar[i];//最多只能拿N/2个字符
				numb=Bchar[i]>n?n:Bchar[i];//最多只能拿N/2个字符
				if(numa+numb<Cchar[i])//如果最多可拿的字符个数小于C串对应字符的个数
				{                     //即AB已经在上限的情况下都不能凑成C
					k=false;
					break;
				}
			}
		}
		if(k)
		{
			cout<<"YES"<<endl;
		}
		else
		{
			cout<<"NO"<<endl;
		}
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值