# Hash Table# String Processing

a786 - 8. 1337 XL8T0RZ

🔗 前往 ZeroJudge 原題

題目描述

題目要求將輸入的 1337 碼轉換為英文。輸入包含一個 1337 碼到英文的對照表,以及需要轉換的 1337 碼文本。程式需要根據對照表將文本中的 1337 碼替換為對應的英文,並輸出轉換後的文本。

解題思路

本題的核心是建立一個 1337 碼到英文的映射關係,然後使用這個映射關係將輸入文本進行替換。

  1. 建立映射表: 首先,程式讀取輸入的對照表,將每個 1337 碼作為鍵,對應的英文作為值,儲存在一個 map 中。
  2. 文本處理: 程式讀取需要轉換的文本,將文本分割成單詞。
  3. 替換: 對於每個單詞,檢查它是否存在於映射表中。如果存在,則將單詞替換為對應的英文;否則,保持單詞不變。
  4. 輸出: 將替換後的單詞連接起來,輸出轉換後的文本。

複雜度分析

  • 時間複雜度: O(N + M + K),其中 N 是對照表的行數,M 是需要轉換的文本的長度,K 是文本中單詞的數量。建立映射表需要 O(N) 的時間,文本處理和替換需要 O(M + K) 的時間。
  • 空間複雜度: O(N + L),其中 N 是對照表的行數,L 是文本中最長單詞的長度。map 儲存對照表需要 O(N) 的空間,臨時變數儲存單詞需要 O(L) 的空間。

程式碼

#include <iostream>
#include <map>
using namespace std;
string s;
map <string,string> mp;
int main(){
	cin.tie(0); ios::sync_with_stdio(false);
	getline(cin,s);
	while(getline(cin,s)){
		if(s=="[1337]")break;
		int i=0;
		string x,y;
		for(i=0;i<s.length();++i){
			if(s[i]==':')break;
			x+=s[i];
		}
		for(i++;i<s.length();++i){
			y+=s[i];
		}
		mp[x]=y;
	} 
	while(getline(cin,s)){
		if(s=="[3ND]")break;
		string tmp;
		s+=' ';
		for(int i=0;i<s.length();++i){
			if(s[i]==' '){
				if(mp.find(tmp)==mp.end()){
					cout << tmp;
				}
				cout << mp[tmp] << " ";
				tmp.clear(); 
			}
			else{
				tmp+=s[i];
			}
		}
		cout << "\n";
	}
}

Discussion