这道题的基本思路就是采用倒排索引来建立 学生->所选课程 的关系
开始做的时候,直接使用
map<string,vector<int> > course;
结果就是超时.原因就是使用string而不是char*.因此考虑为学生姓名建立一个索引
学生姓名->姓名索引->课程集合
<pre name="code" class="cpp">#include<iostream>
#include<vector>
#include<map>
#include<algorithm>
#include<cstdio>
using namespace std;
map<int,vector<int> > course;
int getIndex(char* name){
return (name[0]-'A')*26*26*10+(name[1]-'A')*26*10+(name[2]-'A')*10+(name[3]-'0');
}
int main(){
int N,K;
scanf("%d%d",&N,&K);
for(int i = 0; i < K;i++){
int courseid;
int number;
scanf("%d%d",&courseid,&number);
// cin >> courseid >> number;
for(int i = 0;i < number;i++){
//string name;
char* name = new char[5];
//cin >> name;
scanf("%s",name);
int index = getIndex(name);
course[index].push_back(courseid);
}
}
for(int i = 0 ; i < N;i++){
// string name;
// cin >> name;
char* name = new char[5];
scanf("%s",name);
printf("%s",name);
int index = getIndex(name);
vector<int> vec = course[index];
sort(vec.begin(),vec.end(),less<int>());
int len = vec.size();
// cout << len;
printf(" %d",len);
for(int j = 0; j < len; j++){
// cout << ' ' << vec[j];
printf(" %d",vec[j]);
}
printf("\n");
}
return 0;
}