A30290. 学生课表
题目描述
学生课表
题目描述
某大学有 40000 名学生,开了 2500 门课。给定所有课程的选课名单,你的任务是为每一位前来查询的学生打印其选课的课表。
时间限制: 2000 内存限制: 262144
输入
输入第一行给出 2 个正整数:
N(≤ 40000) 为查询课表的学生人数; K(≤ 2500) 为课程总数。
下面给出每门课的选课名单(课程从 1 到 K 编号) ,格式为: 课程编号选课人数学生姓名 1 学生姓名 2 ... 其中 选课人数 不超过 200 人。学生姓名由 3 个英文大写字母和 1 位数字组成。最后一行给出 N 个前来查询的学生姓名。一行中的数字和姓名都以空格分隔。
输出
对每个前来查询的学生,在一行中输出学生的姓名、 选课门数、 升序输出的课程编号,其间以 1 个空格分隔。行首尾不得有多余空格。
样例输入
11 5
4 7
BOB5 DON2 FRA8 JAY9 KAT3 LOR6 ZOE1
1 4
ANN0 BOB5 JAY9 LOR6
2 7
ANN0 BOB5 FRA8 JAY9 JOE4 KAT3 LOR6
3 1
BOB5
5 9
AMY7 ANN0 BOB5 DON2 FRA8 JAY9 KAT3 LOR6 ZOE1
ZOE1 ANN0 BOB5 JOE4 JAY9 FRA8 DON2 AMY7 KAT3 LOR6 NON9
样例输出
ZOE1 2 4 5
ANN0 3 1 2 5
BOB5 5 1 2 3 4 5
JOE4 1 2
JAY9 4 1 2 4 5
FRA8 3 2 4 5
DON2 2 4 5
AMY7 1 5
KAT3 3 2 4 5
LOR6 4 1 2 4 5
NON9 0
参考答案
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,m;
cin>>n>>m;
map<string,vector<int>> mp;
for(int i = 0;i < m;i++){
int num,ks;
cin>>num>>ks;
for(int j = 0;j < ks;j++){
string s;
cin>>s;
mp[s].push_back(num);
}
}
for(int i = 0;i < n;i++){
string s;
cin>>s;
sort(mp[s].begin(),mp[s].end());
cout<<s<<" "<<mp[s].size();
for(int j = 0;j < mp[s].size();j++){
cout<<" "<<mp[s][j];
}
cout<<endl;
}
}答案解析
//方法二
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
int mhash(char * name) {
return (name[0] - 'A') * 26 * 26 * 10 + (name[1] - 'A') * 26 * 10 + (name[2] - 'A') * 10 + name[3] - '0';
}
vector<int> stu[26 * 26 * 26 * 10 + 1];
int main() {
int N, K;
scanf("%d %d", &N, &K);
int i, j;
char name[5];
int id, n;
for(i = 0; i < K; i++) {
scanf("%d %d", &id, &n);
for(j = 0; j < n; j++) {
scanf("%s", name);
int h = mhash(name);
stu[h].push_back(id);
}
}
for(i = 0; i < N; i++) {
scanf("%s", name);
int h = mhash(name);
sort(stu[h].begin(), stu[h].end());
int s = stu[h].size();
printf("%s %d", name, s);
for(j = 0; j < s; j++) {
printf(" %d", stu[h][j]);
}
printf("\n");
}
return 0;
}