# Hash Table# String Manipulation# Substitution

e501 - 00865 - Substitution Cypher

🔗 前往 ZeroJudge 原題

題目描述

題目要求實作一個替換式密碼解密器。給定一個明文和密文的對應關係,然後對輸入的密文進行解密,或者對輸入的明文進行加密。

解題思路

這題的核心是建立一個明文到密文的映射關係,使用 map 資料結構來儲存這個映射。讀取明文和密文的對應關係後,對於輸入的字串,如果字元在映射中存在,則替換成對應的密文/明文字元,否則保持原字元不變。

複雜度分析

  • 時間複雜度: O(N*M),其中 N 是輸入字串的長度,M 是映射表的大小。最壞情況下,需要遍歷輸入字串的每個字元,並在映射表中查找。
  • 空間複雜度: O(M),其中 M 是映射表的大小,用於儲存明文到密文的映射關係。

程式碼

#include <iostream>
#include <map>
using namespace std;
int t,st;
string a,b;
int main(){
	cin.tie(0); ios::sync_with_stdio(false);
	cin >> t;
	getline(cin,a);
	getline(cin,a);
	while(t--){
		if(st){
			cout << "\n";
		} 
		st=1;
		map <char,char> mp;
		getline(cin,a);
		getline(cin,b);
		for(int i=0;i<a.length();++i){
			mp[a[i]]=b[i];
		}
		cout << b << "\n" << a << "\n";
		while(getline(cin,a)&&a!=""){
			for(int i=0;i<a.length();++i){
				if(mp.find(a[i])==mp.end()){
					cout << a[i];
				}
				else
					cout << mp[a[i]];			
			}
			cout << "\n";
		}
	}
}

Discussion