# Hash Table# Sorting# String Processing

e839 - P6. 飲食分類 (Food)

🔗 前往 ZeroJudge 原題

題目描述

題目要求根據輸入的食物及其種類,查詢特定種類的食物,並按照字典順序輸出這些食物的名稱。如果沒有該種類的食物,則輸出 "No"。

解題思路

使用一個 map (Hash Table) 來儲存食物種類和對應食物名稱的關聯。map 的 key 是食物種類 (string),value 是包含該種類所有食物名稱的字串,食物名稱之間用空格分隔。 讀取輸入的食物和種類資訊,將其儲存在 map 中。 讀取要查詢的食物種類 c。 如果 map 中不存在該種類,則輸出 "No"。 如果存在,則從 map 中獲取該種類的所有食物名稱,使用空格分割成一個字串陣列,對陣列進行排序,然後逐個輸出排序後的食物名稱。

複雜度分析

  • 時間複雜度: O(N log N),其中 N 是食物的數量。主要時間花在排序食物名稱的字串陣列上。map 的插入和查找操作平均時間複雜度為 O(log N),但由於題目限制 N <= 50,可以近似認為是 O(1)。
  • 空間複雜度: O(N),主要用於儲存 map 和字串陣列。

程式碼

#include <iostream>
#include <string>
#include <map>
#include <algorithm>
using namespace std;
int main(){
	int n;
	cin >> n;
	string a,b,c;
	string an[50];
	map <string,string> ans;
	while(n--){
		cin >> a >> b;
		ans[b]+=a;
		ans[b]+=' ';
	}
	cin >> c;
	if(ans.find(c)==ans.end()){
		cout << "No\n";
	}
	else{
		int j=0,t=0;
		string i=ans[c],d;
		for(int il=i.length();j<il;j++){
			if(i[j]!=' '){
				d+=i[j];
			}
			else{
				an[t]=d;
				d.clear();
				t++;
			}
		}
		sort(an,an+t);
		for(int i=0;i<t;i++){
			cout << an[i] << "\n";
		}
	}
}

Discussion