#CSP202409B. 字符串变换

字符串变换

时间限制: 1.0 秒

空间限制: 512 MB

题目描述

本题涉及字符包括大小写字母(A-Za-z)、数字(0-9)和空格共 6363 种。在这个字符集合上,小 P 定义了一个字符替换函数 f(ch)f(ch),表示将字符 chch 替换为 f(ch)f(ch)。 例如 f(a)=bf(a) = b 表示将 a 替换为 bf(b)=0f(b) = 0 表示将 b 替换为 0。 进而可以将其扩展为字符串变换函数 F(s)F(s),表示对字符串 s 进行变换,将 s每个字符 chch 都替换为 f(ch)f(ch)

字符替换函数 ff 可表示为 nn 个字符对 (ch1,ch2)(ch_1, ch_2),即 f(ch1)=ch2f(ch_1) = ch_2

  • nn 个字符对中,ch1ch_1 两两不同,即不会出现同时定义了 f(a)=bf(a) = bf(a)=0f(a) = 0 的情况;
  • 未定义的 f(ch)f(ch),可视为 f(ch)=chf(ch) = ch,即字符 chch 保持不变;
  • 函数 ff 为单射,即当 ch1ch2ch1 \neq ch2 时有 f(ch1)f(ch2)f(ch1) \neq f(ch2),例如不会同时有 f(b)=0f(b) = 0f(0)=0f(0) = 0b0 都被替换为 0)。

现给定初始字符串 s,试处理 mm 个查询:每个查询包含一个正整数 kk,询问对初始字符串 s 变换 kk 次后的结果 Fk(s)F^{k}(s)

输入格式

从标准输入读入数据。

输入共 n+4n + 4 行。

输入的第一行包含一个字符串,形如 #s#,即用两个井号字符 # 将初始字符串 s 囊括其中。

输入的第二行包含一个正整数 nn,表示组成函数 ff 的字符对数;接下来 nn 行每行输入一个形如 #xy# 的字符串,表示 f(x)=yf(x) = y

输入的第 n+3n+3 行包含一个正整数 mm,表示查询的个数;下一行包含空格分隔的 mm 个正整数 k1,k2,,kmk_1, k_2, \cdots, k_m,表示 mm 个查询。

输出格式

输出到标准输出。

输出共 mm 行,依次输出 mm 个查询的结果;输出时每行同样是一个形如 #s# 的字符串,即用两个井号把变换后的字符串 s 括起。

#Hello World#
6
#HH#
#e #
# r#
#re#
#oa#
#ao#
3
1 2 3
#H llarWaeld#
#HrlloeWo ld#
#Hella Warld#

子任务

60%60\% 的测试数据保证初始字符串 s 仅包含小写字母,且输入的 nn 个字符对也皆为小写字母(即保证小写字母仅会被替换为小写字母);

80%80\% 的测试数据保证查询数量 m10m \le 10、变换次数 k100k \le 100

全部测试数据保证 0<n630 < n \le 630<m1030 < m \le 10^{3}0<k1090 < k \le 10^{9} 且初始字符串 s 包含不超过 100 个字符。

提示

由于读入的字符串中包含空格字符,推荐使用按行读取的方式,避免读入时跳过空格(如 cin 直接读入字符串)。

C 语言:可以使用 fgets() 函数读入整行,fgets(s, count, stdin) 会从标准连续输入读入至多 count - 1 个字符,并存入字符数组 s,直到遇到换行符或文件末尾为止。在前一种情况下,s 结尾处会存有读入的换行符。也可使用 getchar() 函数逐个字符读入,如 char ch = getchar();,这种方法需手动判断是否到达行末,即返回值是否为 \n

C++:可以使用 std::getline() 函数读入整行:std::getline(std::cin, s) 会从标准输入读入字符,并存入字符串 std::string s 中,直到换行符或文件末尾为止。在前一种情况下,换行符会从标准输入中读出,但不会存入字符串 s 中。

Python:使用 input() 函数即可读入整行。