1039. Course List for Student (25)

来源:互联网 发布:高校工资知乎 编辑:程序博客网 时间:2024/05/17 06:29

IDEA

1.很自然的思路是设计map<string,vector<int> > record; 但是由于string的各种操作,使得最后一个case超时;

2.我们观察到文中描述name右3个大写字母和一位数字组成,即最多有MAX=26*26*26*10个学生。需要做name到数字id之间的映射,

id=(name[0]-'A')*26*26*10+(name[1]-'A')*26*10+(name[2]-'A')*10+name[3]-'0'

3.用vector<int> stu[MAX]存储即可


CODE

#include<iostream>#include<cstdio>#include<vector>  #include<algorithm>#include<fstream>using namespace std;#define MAX 26*26*26*10vector<int> stu[MAX];int hashName(char *name){return (name[0]-'A')*26*26*10+(name[1]-'A')*26*10+(name[2]-'A')*10+name[3]-'0';}int main(){#ifndef ONLINE_JUDGEfreopen("input.txt","r",stdin);#endifint n,k;scanf("%d%d",&n,&k);while(k--){int course,numStu;scanf("%d%d",&course,&numStu);while(numStu--){char name[5];scanf("%s",name);int stu_id=hashName(name);stu[stu_id].push_back(course);}}for(int i=0;i<n;i++){char query[5];scanf("%s",query);printf("%s",query);int stu_id=hashName(query);printf(" %d",stu[stu_id].size());sort(stu[stu_id].begin(),stu[stu_id].end());for(int j=0;j<stu[stu_id].size();j++){printf(" %d",stu[stu_id][j]);}printf("\n");}#ifndef ONLINE_JUDGEfclose(stdin);#endifreturn 0;}


0 0