最初由於還沒看過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;
}