e501 - 00865 - Substitution Cypher
題目描述
題目要求實作一個替換式密碼解密器。給定一個明文和密文的對應關係,然後對輸入的密文進行解密,或者對輸入的明文進行加密。
解題思路
這題的核心是建立一個明文到密文的映射關係,使用 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";
}
}
}