#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;
}
湖南多校对抗赛(D-D)
最新推荐文章于 2021-05-06 19:12:56 发布