最初由于还没看过hash散列相关知识,不清楚可将字符串转成特定整型这么好用的东西,因此选择了用map作映射,这样一来虽然解题相对来说方便不少,不用自己做映射内部操作,但时间复杂度比较高,不过,我没有超时(oj上没有超时的原因是时间限制延长了,以前是200ms,现在是600ms),还有,字符串的输入输出必须用scanf,printf来实现,若用cin,cout也会超时。
#include<cstdio>
#include<cstdlib>
#include<string.h>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<string>
#include<algorithm>
using namespace std;
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt","r",stdin);
#endif
map<string,set<int> > m; //set每放进去一个数,会自动进行排序
int n,k,ind,nind;
char word[5];
scanf("%d%d",&n,&k);
for(int i=1;i<=k;i++){
scanf("%d%d",&ind,&nind);
for(int j=1;j<=nind;j++){
scanf("%s",word);
string key=word;
m[key].insert(ind); //字符串映射
}
}
for(int i=1;i<=n;i++){
scanf("%s",word);
string key=word;
printf("%s",word);
if(m[word].size()==0){
printf(" 0\n");
}else{
printf(" %d",m[word].size());
set<int>::iterator it;
for(it=m[word].begin();it!=m[word].end();it++){ //输出
printf(" %d",*it);
}
printf("\n");
}
}
return 0;
}
算法笔记:使用hash散列的方法,利用整型作映射,但不能用二维数组,会超内存,使用变长数组vector可减少空间消耗。
#include<cstdio>
#include<cstdlib>
#include<string.h>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<string>
#include<algorithm>
using namespace std;
vector<int> student[26*26*26*10+10]; //应该放在外面作全局变量,放里面会超内存
int hashes(string key){ //hash散列,作变换
int id=0;
for(int i=0;i<3;i++){
id=id*26+(key[i]-'A');
}
id=id*10+(key[3]-'0');
return id;
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt","r",stdin);
#endif
int n,k,ind,nind;
char word[5];
scanf("%d%d",&n,&k);
for(int i=0;i<k;i++){
scanf("%d%d",&ind,&nind);
for(int j=0;j<nind;j++){
scanf("%s",word);
string key=word;
int id=hashes(key);
student[id].push_back(ind);
}
}
for(int i=0;i<n;i++){
scanf("%s",word);
string key=word;
int id=hashes(key);
printf("%s %d",word,student[id].size());
if(student[id].size()!=0){
for(int p=0;p<student[id].size()-1;p++){ //对一个vector作冒泡排序
for(int q=0;q<student[id].size()-p-1;q++){
if(student[id][q]>student[id][q+1]){
int temp=student[id][q];
student[id][q]=student[id][q+1];
student[id][q+1]=temp;
}
}
}
for(int j=0;j<student[id].size();j++){ //输出
printf(" %d",student[id][j]);
}
}
printf("\n");
}
return 0;
}