题目描述
知识点
手动哈希
我的实现
码前思考
前几次提交使用的是map+string,结果都超时了。后来选择了手动hash,将string转换成int,然后使用vector数组,就过题了。
主要还是map的性能不太行,加上string的cin和cout开销太大了。
代码实现
//采用map+vetctor
#include <iostream>
#include <unordered_map>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn = 26*26*26*10+20;
//会超时,得使用hash的思想
vector<int> mp[maxn];
int change(char name[]){
int id=0;
int base = 26;
for(int i=0;i<3;i++){
id = id * base + (name[i]-'A');//注意哈希的方法,是转变为26进制,注意AAA这种特殊的情况
}
id = id * 10 + name[3]-'0';
return id;
}
int main(){
//freopen("input.txt","r",stdin);
int n,k;
char name[5];
scanf("%d %d",&n,&k);
for(int i=0;i<k;i++){
int cid,ni;
scanf("%d %d",&cid,&ni);
for(int j=0;j<ni;j++){
scanf("%s",name);
int id = change(name);
mp[id].push_back(cid);
}
}
//读入查询
for(int i=0;i<n;i++){
scanf("%s",name);
int id = change(name);
printf("%s",name);
if(mp[id].size()==0){
printf(" 0");
}else{
printf(" %d",mp[id].size());
//排序
sort(mp[id].begin(),mp[id].end());
for(auto j : mp[id]){
printf(" %d",j);
}
}
printf("\n");
}
return 0;
}
码后反思
- 由于使用map习惯了,所以现在写手动哈希不太会写了。。。
- 注意这里的hash有个很奇怪的现象就是对于AAA9,它的前缀AAA,它的hash值是0,这个是需要自己好好思考的。咱们是将A~Z哈希到0 ~ 25上呢 ~之前自己学习的时候没有太注意这方面。。。
- 所以以后要是碰见不定长的字符串的话,那么A与AAA就不能区分了,所以要转变一下进制大小,换成27进制啥的!