#include <deque> #include <iostream> #include <set> #include <string> using namespace std; /* HJ20 HJ21 HJ29 HJ30 HJ36 都是与密码相关的问题 程序思路:目标是构建两个一一对应的字符串 一个是 26位字母表 一个是 输入中的字符串按照题目要求的方法得出的字符串 str2. 题目的关键也是构建 str2. 如何构建str2? 1. 遍历字符串 2. 通过set集合去除字符串中重复元素 3. 通过deque 双端队列保持字母的相对位置不变 4. 这样就将单词中包含有重复的字母,只保留第1个,将所得结果作为新字母表开头, 5. 之后再补上后面缺少的单词 */ int main() { string key, str; cin >> key; cin >> str; string src = "abcdefghijklmnopqrstuvwxyz"; string enc; deque<char> dq;// 保持字母相对位置不变 set<char> st; // 去重 // 遍历密钥字符串 for (auto c : key) { if (st.count(c) == 0) { st.insert(c); dq.push_back(c);; } } while (!dq.empty()) { enc += dq.front(); dq.pop_front(); } // 字母表中剩余的字母填充完整 for (char c = 'a'; c <= 'z'; c++) { if (st.count(c) == 0) { enc += c;; } } string ans; for (auto c : str) { ans += enc[src.find_last_of(c)]; } cout << ans << endl; } // 64 位输出请用 printf("%lld")