# Hash Table# String Manipulation# Substitution

j010 - 11946 - Code Number

🔗 前往 ZeroJudge 原題

題目描述

題目要求將使用特定數字替換字母的加密訊息解碼為原始訊息。加密規則由範例訊息提供,例如 'H3LL0' 替換為 'HELLO'。

解題思路

這題的核心是建立一個替換表(mapping),將加密訊息中的數字對應到原始訊息中的字母。程式首先定義兩個字串 x (加密訊息) 和 y (原始訊息),然後建立一個陣列 mp 作為替換表。mp 陣列的索引代表 ASCII 值,初始時 mp[i] = i,表示每個字元對應自身。接著,程式遍歷加密訊息 x,將 x 中的每個字元對應到 y 中的相同位置的字元,更新 mp 陣列。最後,程式讀取輸入的加密訊息,並使用 mp 陣列將每個字元替換為原始字元,並輸出解碼後的訊息。特別注意 '2' 的處理,如果 '2' 前面是 '4',則替換為對應的字元,否則替換為 'Z'。

複雜度分析

  • 時間複雜度: O(N + M),其中 N 是加密訊息的長度,M 是替換表的初始化長度(固定為 300)。
  • 空間複雜度: O(1),因為替換表 mp 的大小是固定的。

程式碼

#include <iostream>
using namespace std;
string x="H3LL0 MY L0V3, 1 M H499Y 83C4U53 500N 1 W1LL 83 70 Y0UR 51D3.7H15 71M3 W17H0U7 Y0U H45 833N 373RN4L. 1 1NV173 Y0U 70 7H3 2000N3 70 533 7H3 238R42 4ND 60R1L42.";
string y="HELLO MY LOVE, I M HAPPY BECAUSE SOON I WILL BE TO YOUR SIDE.THIS TIME WITHOUT YOU HAS BEEN ETERNAL. I INVITE YOU TO THE ZOOONE TO SEE THE ZEBRAS AND GORILAS.";
int mp[300];
string s;
int main(){
	cin.tie(0); ios::sync_with_stdio(0);
	for(int i=0;i<300;++i)mp[i]=i;
	for(int i=0;i<x.size();++i)mp[x[i]]=y[i];
	getline(cin,s); 
	while(getline(cin,s)){
		if(s==""){
			cout << "\n";
			continue;
		}
		for(int i=0;i<s.size();++i){
			if(s[i]=='2'){
				if(i&&s[i-1]=='4')cout << char(mp[s[i]]);
				else cout << 'Z';
			}
			else cout << char(mp[s[i]]);
		}
		cout << "\n";
	}
}

Discussion