题目链接
翻译:
输入:
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;
vector <int> a[26*26*26*10+1];//用来记录名字,3个大写字母+1个数字
int getid(char str[])//把名字转换成数字记录
{
int id=0,i;
for(i=0; i<3; i++)
id=id*26+str[i]-'A';
id=id*10+str[3]-'0';
return id;
}
int main()
{
int n,m,i,num,sum,id;
char str[50];
scanf("%d%d",&n,&m);//n个学生
while(m--)//m个课程
{
scanf("%d%d",&num,&sum);//课程号是num,选课人数是sum
while(sum--)
{
scanf("%s",str);//选课学生的名字
id=getid(str);//转换成数字
a[id].push_back(num);//存进vector里面
}
}
while(n--)//遍历n个学生
{
scanf("%s",str);//读入学生的名字
id=getid(str);
printf("%s",str);
sort(a[id].begin(),a[id].end());//把该学生选的课程按课程号从小到大排序
printf(" %d",a[id].size());//输出该学生一共选了多少课程
for(i=0; i<a[id].size(); i++)//分别输出课程对应的课程号
printf(" %d",a[id][i]);
printf("\n");
}
return 0;
}