返回目录![在这里插入图片描述](https://img-blog.csdnimg.cn/20200409162143879.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ExOTIwOTkzMTY1,size_16,color_FFFFFF,t_70)
题意
有N个学生, K门课。现在给出选择每门课的学生姓名并在之后给出N个学生的姓名,要求按顺序给出每个学生的选课情况。
样例(可复制)
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
//output
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
注意点
- 本题的最后一组数据比较庞大,使用map跟string会导致超时。且本题的姓名格式是固定的3个大写字母+1个数字,所以可以考虑使用散列的思想给每个姓名编个id。
- vetor数组的大小至少需要26 * 26 * 26 * 10 (即3个英文字母和1个数字)。
- 本题数据量大,不要使用cin和cout
- 如果使用二维数组存放学生所选的课程编号,会导致最后一组数据内存超限,因此需要使用vector
#include<bits/stdc++.h>
using namespace std;
vector<int> cou[26*26*26*10+1];//175761
int getid(char name[]){
int id=0;
for(int i=0;i<3;i++)id=id*26+(name[i]-'A');
id=id*10+name[3]-'0';
return id;
}
int main(){
int n,k;
scanf("%d%d",&n,&k);
while(k--){
int num,count;//课程号,学生人数
scanf("%d%d",&num,&count);
while(count--){
char name[5];
scanf("%s",name);
int id=getid(name);
cou[id].push_back(num);
}
}
while(n--){
char name[5];
scanf("%s",name);
int id=getid(name);
sort(cou[id].begin(),cou[id].end());
printf("%s %d",name,cou[id].size());
for(int i=0;i<cou[id].size();i++)printf(" %d",cou[id][i]);
printf("\n");
}
return 0;
}