小红想买些珠子做一串自己喜欢的珠串。卖珠子的摊主有很多串五颜六色的珠串,但是不肯把任何一串拆散了卖。于是小红要你帮忙判断一下,某串珠子里是否包含了全部自己想要的珠子?如果是,那么告诉她有多少多余的珠子;如果不是,那么告诉她缺了多少珠子。
为方便起见,我们用[0-9]、[a-z]、[A-Z]范围内的字符来表示颜色。例如在图1中,第3串是小红想做的珠串;那么第1串可以买,因为包含了全部她想要的珠子,还多了8颗不需要的珠子;第2串不能买,因为没有黑色珠子,并且少了一颗红色的珠子。
图 1
输入格式:
每个输入包含1个测试用例。每个测试用例分别在2行中先后给出摊主的珠串和小红想做的珠串,两串都不超过1000个珠子。
输出格式:
如果可以买,则在一行中输出“Yes”以及有多少多余的珠子;如果不可以买,则在一行中输出“No”以及缺了多少珠子。其间以1个空格分隔。
输入样例1:ppRYYGrrYBR2258
YrR8RrY
输出样例1:
Yes 8
输入样例2:
ppRYYGrrYB225
YrR8RrY
输出样例2:
No 2
==========================================================================================
思路:
颜色的对应那么多?连数字带大小写字母,去他的!全变成数字记录进数组!
下标对应颜色值,值代表珠子个数。
先扫一遍卖家给的串,数组对应位++,然后再扫一遍小红要的串,对应位置--。一旦减的过程中出现了负数,就
代表这串缺要的珠子,那么要统计的数字就是数组里所有负数和的绝对值;如果不缺珠子的话就更好办了,统计
的值就是两串的长度差。
最后记得数组长度开大点。
#include <iostream> #include <iomanip> #include <cmath> #include <algorithm> #include <cstring> #include <sstream> #include <map> #include <set> #include <vector> #include <queue> using namespace std; int main() { int mark[100]={0}; int i,lena,lenb,temp,sum=0; bool flag=true; string a,b; cin>>a>>b; lena = a.size(); lenb = b.size(); for(i=0;i<lena;i++) { if(isalpha(a[i]) == true) { if(isupper(a[i]) == true) temp = a[i]-'A'+36; else temp = a[i]-'a'+10; } else temp = a[i]-'0'; mark[temp]++; } for(i=0;i<lenb;i++) { if(isalpha(b[i]) == true) { if(isupper(b[i]) == true) temp = b[i]-'A'+36; else temp = b[i]-'a'+10; } else temp = b[i]-'0'; mark[temp]--; if(mark[temp] < 0) flag = false; } if(flag == false) { for(i=0;i<100;i++) { if(mark[i] < 0) sum += abs(mark[i]); } cout<<"No "<<sum<<endl; } else cout<<"Yes "<<lena-lenb<<endl; return 0; }