向量与结构体结合
排序和映射结合

#include<bits/stdc++.h>
#include <unordered_map>
const int maxn=1e5+10;
using namespace std;

struct node{
	string s;
	int  score;
};

bool cmp(node a, node b){
		if(a.score!=b.score) return a.score > b.score;
		else return a.s<b.s;
}

int main(){
	int n,m;
	scanf("%d%d",&n,&m);
	vector<node> v(n);    //向量长度 
	for(int i=0;i<n;i++){
		cin>> v[i].s >>v[i].score;
	}
	
	for(int i=1;i<=m;i++){
		string s;
		int tmp;
		 cin>>tmp>>s;
		 vector<node> temp;
		 printf("Case %d: %d %s\n",i,tmp,s.c_str());
		if(tmp==1){
			for(int j=0;j<n;j++){
				if(s[0]==v[j].s[0])
					temp.push_back(v[j]);
			}
			sort(temp.begin(),temp.end(),cmp);
			if(temp.size()==0){
				printf("NA\n");
			}else{
				for(int j=0;j<temp.size();j++){
						printf("%s %d\n",temp[j].s.c_str(),temp[j].score);
			    }		
			}
			
		}else if(tmp==2){
				int number=0,total=0;
				for(int j=0;j<n;j++){
					if(v[j].s.substr(1,3) == s) {
						number++;
						total+=v[j].score;
					}
			}
				if(number==0){
					printf("NA\n");
				}else{
					printf("%d %d\n",number,total);
				}	
			}else if(tmp==3){
				unordered_map<string ,int> mp;
				mp.clear();
				unordered_map<string ,int>::iterator it;
				for(int j=0;j<n;j++){
					if(v[j].s.substr(4,6)==s) mp[v[j].s.substr(1,3)]++;
				}
				for(it=mp.begin();it!=mp.end();it++){
					temp.push_back({it->first,it->second});
				}
				sort(temp.begin(),temp.end(),cmp);
				if(temp.size()==0){
					printf("NA\n");
				}else{
					for(int j=0;j<temp.size();j++){
						printf("%s %d\n",temp[j].s.c_str(),temp[j].score);
					}
					
				}
				
			}
			
		}
	
	return 0;
}