##### 20、PAT准考证信息统计✔
会了上题的经典之后,这一题虽然多,但都是一个逻辑了。
另外一点是,这一点用cout会超时,改成printf过了。。。
s.substr(pos,n) //不会改变s
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
#include<unordered_map>
using namespace std;
const int N=10000+10,M=110;
int n,m;
string id[N];int score[N];
struct person{
string id;
int score;
bool operator < (person t){
if(score != t.score) return score>t.score;
else return id < t.id;
}
};
struct Site{
string site;
int cnt;
bool operator < (Site s){
if(cnt!=s.cnt) return cnt> s.cnt;
else return site<s.site;
}
};
void query1(string order){
vector<person> persons;
for(int i=0;i<n;i++){
person t;
t.id=id[i];
t.score=score[i];
if(id[i][0]==order[0]) persons.push_back(t);
}
if(persons.size()==0) printf("NA\n");
else{
sort(persons.begin(),persons.end());
for(auto &t:persons){
printf("%s %d\n",t.id.c_str(),t.score);
}
}
}
void query2(string order){
int cnt=0;int sum=0;
for(int i=0;i<n;i++){
if( id[i].substr(1,3) == order){
cnt++;
sum+=score[i];
}
}
if(cnt==0) cout<<"NA"<<endl;
else
cout<<cnt<<" "<<sum<<endl;
}
void query3(string order){
unordered_map<string,int> date;
for(int i=0;i<n;i++){
string site=id[i].substr(1,3);
if( id[i].substr(4,6) == order){
date[site]+=1;
}
}
vector<Site> sites;
for(auto &m:date){
Site site;
site.site = m.first;
site.cnt = m.second;
sites.push_back(site);
}
if(sites.size()==0) cout<<"NA"<<endl;
else{
sort(sites.begin(),sites.end());
for(auto &t:sites){
printf("%s %d\n",t.site.c_str(),t.cnt);
}
}
}
int main(){
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>id[i]>>score[i];
}
for(int i=0;i<m;i++){
int type;string order;
cin>>type>>order;
cout<<"Case "<<i+1<<": "<<type<<" "<<order<<endl;
if(type==1) query1(order);
else if(type==2) query2(order);
else if(type==3) query3(order);
}
return 0;
}