1039. 到底买不买(20)

来源:互联网 发布:这就是命 网络歌手 编辑:程序博客网 时间:2024/06/06 23:50

小红想买些珠子做一串自己喜欢的珠串。卖珠子的摊主有很多串五颜六色的珠串,但是不肯把任何一串拆散了卖。于是小红要你帮忙判断一下,某串珠子里是否包含了全部自己想要的珠子?如果是,那么告诉她有多少多余的珠子;如果不是,那么告诉她缺了多少珠子。

为方便起见,我们用[0-9]、[a-z]、[A-Z]范围内的字符来表示颜色。例如在图1中,第3串是小红想做的珠串;那么第1串可以买,因为包含了全部她想要的珠子,还多了8颗不需要的珠子;第2串不能买,因为没有黑色珠子,并且少了一颗红色的珠子。


输入格式:

每个输入包含1个测试用例。每个测试用例分别在2行中先后给出摊主的珠串和小红想做的珠串,两串都不超过1000个珠子。

输出格式:

如果可以买,则在一行中输出“Yes”以及有多少多余的珠子;如果不可以买,则在一行中输出“No”以及缺了多少珠子。其间以1个空格分隔。

输入样例1:
ppRYYGrrYBR2258YrR8RrY
输出样例1:
Yes 8
输入样例2:
ppRYYGrrYB225YrR8RrY
输出样例2:
No 2

//使用map键值对保存每一个字符串中每个字符的出现个数,然后遍历第二个字符串,如果其中有字符的个数比第一个字符串中对应的个数多,说明缺少珠子,把差额累加并把结果置为no
//最后如果为yes,说明所有的颜色都不缺珠子,则剩余的是两个字符串长度之差,如果为no,缺少的是累加的差额。

#include<iostream>
#include<string> 
#include<map>
using namespace std;


int main()
{
map<char,int> m1,m2;
string s1,s2;
cin>>s1>>s2;
int l1=s1.length();
int l2=s2.length();

for(int p=0;p<l1;p++)
{
char c=s1[p];
map<char,int>::iterator it;
it=m1.find(c);
if(it==m1.end())
{
m1.insert(pair<char,int>(c,1));
}
else
{
m1[c]++;
}
}
for(int p=0;p<l2;p++)
{
char c=s2[p];
map<char,int>::iterator it;
it=m2.find(c);
if(it==m2.end())
{
m2.insert(pair<char,int>(c,1));
}
else
{
m2[c]++;
}
}
string flag="Yes";
int a=0;
map<char,int>::iterator it;
for(it=m2.begin();it!=m2.end();it++)
{
char cc=it->first;
int ii=it->second;
//cout<<cc<<":"<<ii<<"-"<<m1[cc]<<endl;
if(ii>m1[cc])
{
flag="No";
a=a+(ii-m1[cc]);
}
}

if(flag=="Yes")
{
cout<<flag<<" "<<(l1-l2); 
}
if(flag=="No")
{
cout<<flag<<" "<<a; 
}
return 0;

0 0
原创粉丝点击