a786 - 8. 1337 XL8T0RZ
題目描述
題目要求將輸入的 1337 碼轉換為英文。輸入包含一個 1337 碼到英文的對照表,以及需要轉換的 1337 碼文本。程式需要根據對照表將文本中的 1337 碼替換為對應的英文,並輸出轉換後的文本。
解題思路
本題的核心是建立一個 1337 碼到英文的映射關係,然後使用這個映射關係將輸入文本進行替換。
- 建立映射表: 首先,程式讀取輸入的對照表,將每個 1337 碼作為鍵,對應的英文作為值,儲存在一個
map中。 - 文本處理: 程式讀取需要轉換的文本,將文本分割成單詞。
- 替換: 對於每個單詞,檢查它是否存在於映射表中。如果存在,則將單詞替換為對應的英文;否則,保持單詞不變。
- 輸出: 將替換後的單詞連接起來,輸出轉換後的文本。
複雜度分析
- 時間複雜度: 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";
}
}