/*
题意:
1、第一行给出两个数字,第一个,学生查询课程的人数;第二个,总的课程数
2、第二行给出课程号,以及注册这门课的人数
3、第三行给出学生的名字
4、最后是N个来查询
输出:
1、输出学生的名字,学生参加的课程数,课程号(递增排序)
解题:用vector无疑了,怎么用
1、用向量数组,名字散列成hash表下标,从而把成绩压入向量中
learn && wrong:
1、解题的思路不错,(哈希+向量数组)
2、用Map会超时,用了向量数组,脑海要有向量数组的定义
3、用cin和cout会超时
4、用二维数组会超时,所以用vector来减少空间量
5、vector也可以用sort函数的
*/
#include <iostream>
#include <vector>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 40010; //总人数
const int M = 26 * 26 * 26 * 10 + 1; //由星美你散列成的数字上界
vector<int> selectcourse[M]; //每个学生选课的记录
int getid(char str[]) {
int id = 0;
for (int i = 0;i < 3;++i) {
id = id * 26 + (str[i] - 'A');
}
id = id * 10 + (str[3] - '0');
return id;
}
int main()
{
char name[5];
int n, k;
scanf("%d%d", &n, &k); //查询学生人数以及课程数
for (int i = 0;i < k;++i) {
int courses, x;
scanf("%d%d", &courses, &x); //输入每门课程数以及选课人数
for (int j = 0;j < x;++j) {
cin>>name; //输入选课学生姓名
int id = getid(name); //将姓名散列为一个整数作编号
selectcourse[id].push_back(courses); //将课程编号压入每一个学生选择中
}
}
for (int i = 0;i < n;++i) { //n个查询
cin>>name; //学生姓名
int id = getid(name); //获得学生编号
sort(selectcourse[id].begin(), selectcourse[id].end()); //从小到大排序
printf("%s %d", name, selectcourse[id].size()); //姓名,选课数
for (int j = 0;j < selectcourse[id].size();++j) { //!!!下标错了
printf(" %d", selectcourse[id][j]);
}
printf("\n");
}
return 0;
}