A1039

最初由於還沒看過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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章