一开始想到用map<string,set<int> >,但是会超时。由于题目中的名字由三个字母和一个数字组成,因此有26*26*26*10种,因此可以用hash来做。
使用set<int> mm[MAX],MAX=26*26*26*10+5; 同时输入名字时也应改为char s[5],scanf来输入。
AC代码:
#include<iostream>
#include<vector>
#include<map>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#include<list>
#include<set>
#define inf 26*26*26*10+5
using namespace std;
set<int> mm[inf];
int main()
{
int n,k;
scanf("%d %d",&n,&k);
for(int i=0;i<k;i++)
{
int id;
int m;
scanf("%d %d",&id,&m);
for(int j=0;j<m;j++)
{
char s[5];
scanf("%s",s);
int num=(s[0]-'A')*26*26*10+(s[1]-'A')*26*10+(s[2]-'A')*10+(s[3]-'0');
//cout<<num<<endl;
mm[num].insert(id);
}
//cout<<1<<endl;
}
for(int i=0;i<n;i++)
{
char s[5];
scanf("%s",s);
printf("%s ",s);
int num=(s[0]-'A')*26*26*10+(s[1]-'A')*26*10+(s[2]-'A')*10+(s[3]-'0');
printf("%d",mm[num].size());
set<int>::iterator it;
for(it=mm[num].begin();it!=mm[num].end();it++)
{
printf(" %d",*it);
}
printf("\n");
}
}
|