B.对称编码
每次测试时限:2 秒
每次测试的内存限制:256 兆字节
输入:标准输入
输出:标准输出
波利卡普有一个由小写拉丁字母组成的字符串 $s$ 。他使用以下算法对这个字符串进行编码:
- 首先,他构建一个新的辅助字符串 $r$ ,该字符串由字符串 $s$ 中所有不同的字母组成,按字母顺序书写;
- 然后进行如下编码:将字符串 $s$ 中的每个字符替换为字符串 $r$ 中的对称字符(字符串 $r$ 中的第一个字符将被最后一个字符替换,第二个字符将被从头开始的第二个字符替换,以此类推)。
例如, $s$ \=”codeforces “字符串的编码过程如下:
- 字符串 $r$ 得到 “cdefors”;
- 第一个字符 $s_1$ \=’c’ 被替换为’s’;
- 第二个字符 $s_2$ \=’o’ 被替换为’e’;
- 第三个字符 $s_3$ \=’d’ 被替换为’r’;
- …
- 最后一个字符 $s_{10}$ \=’s‘ 被替换为’c’。
字符串 $r$ 和 $s$ \=”codeforces” 的替换。
因此,对字符串 $s$ \=”codeforces” 进行编码的结果是字符串 “serofedsoc”。
编写一个程序来执行解码,即从编码结果中还原出原始字符串 $s$ 。
输入
第一行包含一个整数 $t$ ( $1 \le t \le 10^4$ )–测试用例数。( $1 \le t \le 10^4$ ) - 测试用例的数量。
每个测试用例的第一行包含一个整数 $n$ ( $1 \le n \le 2 \cdot 10^5$ ) - 字符串 $b$ 的长度。
每个测试用例的第二行包含一个长度为 $n$ 的字符串 $b$ ,由小写拉丁字母组成,这是原始字符串 $s$ 的编码结果。
保证测试中所有测试用例的 $n$ 值总和不超过 $2 \cdot 10^5$ 。
输出
对于每个测试用例,输出字符串 $s$ ,从中获取编码结果 $b$ 。
#include <iostream>
#include <vector>
#include <unordered_map>
#include <set>
#include <string>
using namespace std;
int main()
{
int t;
cin >> t;
while (t--)
{
int n;
string b;
cin >> n >> b;
set<char> unique_chars(b.begin(), b.end());
string r(unique_chars.begin(), unique_chars.end());
unordered_map<char, char> sym_map;
int len = r.length();
for (int i = 0; i < len; ++i)
{
sym_map[r[i]] = r[len - i - 1];
}
string s;
for (char ch : b)
{
s += sym_map[ch];
}
// Output the original string s
cout << s << endl;
}
return 0;
}