题目描述
伊娃需要若干颜色的若干珠子来制作一条她喜欢的手链。
因此,她去往一家小商店购买珠子。
商店里的珠子都是一整串串起的,里面包含各种颜色的珠子。
已知,商店每串珠子都不拆开售卖,只能整串购买。
伊娃想知道如果她购买一串商店的珠子,里面能否包含她需要的所有珠子。
如果能包含她需要的所有珠子,则回答 Yes,并输出她购买的多余的珠子的数量。
如果不能包含她需要的所有珠子,则回答 No,并输出她还缺少的珠子的数量。
为了简单起见,我们用数字 0∼90∼9,以及大小写字母 A∼Z,a∼z�∼�,�∼� 来表示珠子的颜色。
例如,下图中的第三串珠子就是伊娃想要串成的成品。
那么购买第一串珠子就可以达成目的,因为它包含了所有必要的珠子以及 88 个多余的珠子。
但是购买第二串珠子就不行,因为里面没有黑色珠子,并且少了一个红色珠子。

输入格式
共两行,第一行包含一个字符串表示商店的珠子串。
第二行包含一个字符串表示伊娃想要串成的珠子串。
输出格式
输出共一行。
如果能包含她需要的所有珠子,则回答 Yes,并输出她购买的多余的珠子的数量。
如果不能包含她需要的所有珠子,则回答 No,并输出她还缺少的珠子的数量。
回答和数量之间用一个空格隔开。
数据范围
两个字符串的长度都不超过 10001000。
输入样例:
ppRYYGrrYBR2258
YrR8RrY
输出样例:
Yes 8
题解
#include<iostream>
#include<bits/stdc++.h>
#include<map>
using namespace std;
int main(){
string a,b;
map<char,int> mp,str;
set<char> arr;
int n,ans=0;
cin>>a>>b;
n=a.size();
for(int i=0;i<n;i++){
mp[a[i]]++;
}
for(int i=0;i<b.size();i++){
str[b[i]]++;
arr.insert(b[i]);
}
for(set<char>::iterator it=arr.begin();it!=arr.end();it++){
if(str[*it]>mp[*it])
ans=ans+str[*it]-mp[*it];
}
if(ans>0){
cout<<"No"<<" "<<ans;
}
else
cout<<"Yes"<<" "<<a.size()-b.size();
return 0;
}
优化后的代码
#include<iostream>
#include<map>
#include<bits/stdc++.h>
using namespace std;
int main(){
string a,b;
int ans;
cin>>a>>b;
map<char,int> mp;
for(int i=0;i<a.size();i++){
mp[a[i]]++;
}
for(int i=0;i<b.size();i++){
if(mp[b[i]]>0)
mp[b[i]]--;
else
ans++;
}
if(ans!=0)
cout<<"Yes"<<" "<<a.size()-b.size();
else
cout<<"No"<<" "<<ans;
return 0;
}