题目描述
知识点
手工哈希
我的实现
码前思考
由于前面做了一道Course List for Student,所以这里做的还算顺利。
只是关于如何将数字重新变成字符数组呢?我们可以想象,如果每次都是使用函数,那么很麻烦,也很耗时。因此我们使用一个id2name
的数组来保存id
到name
的映射,这样就能节省不少空间和时间了。我们的courseList里面只要存储id
就好,到时候输出name
时,直接映射就可了。
代码实现
//使用一个数组存放数字到名字的映射
#include <iostream>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn = 26*26*26*10+20;
//需要大内存容量的东西放到main函数外面
char id2name[maxn][5];
vector<int> clist[2510];
int change(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);
char name[5];
int id;
int ni;
int cid;
for(int i=0;i<n;i++){
scanf("%s",name);
id = change(name);
strcpy(id2name[id],name);
scanf("%d",&ni);
for(int j=0;j<ni;j++){
scanf("%d",&cid);
clist[cid].push_back(id);
}
}
//排一下序,并且输出
for(int i=1;i<=k;i++){
printf("%d %d\n",i,clist[i].size());
sort(clist[i].begin(),clist[i].end());
for(int j=0;j<clist[i].size();j++){
printf("%s\n",id2name[clist[i][j]]);
}
}
return 0;
}
码后反思
还是那个老问题,需要注意AAA,它的哈希值是0!还有就是字符数组字典序和哈希值升序之间的关系。