解题思路
题目有一个长度为 n 的字符串 s,接下来进行 q 次操作,每次给出一个替换规则 x→y,表示把当前字符串中所有字符 x 都替换成字符 y。要求输出所有操作结束后的最终字符串。
一个很自然的想法是每次真的去修改整个字符串,但这样一次操作最坏要扫一遍字符串,总复杂度会达到 O(nq),显然无法通过。
这里要用到的核心算法思想是 映射维护。
由于字符串只由 26 个小写字母组成,我们不必真的反复修改整个字符串,只需要维护:
P4746.第1题-轮转
题目内容
给你一个长度为n 的字符串 s,接下来会进行 q 次操作。每次操作会给出一个字符变换规则x→y,你需要将当前字符串里所有的字符 x 替换为字符 y。请你给出在完成所有操作后的字符串。
输入描述
每个测试文件均包含多组测试数据。第一行输入一个整数 T(1≤T≤10)代表数据组数,每组测试数据描述如下:
- 第一行输入两个正整数n,q((1≤n,q≤4×105),表示字符串长度和操作次数;
- 第二行输入一个长度为 n 且仅由小写字母组成的字符串 s;
- 此后q 行,每行输入两个小写字母x,y,表示一次替换操作,即将字符串中所有的 x 替换为 y。
除此之外,保证单个测试文件的 n之和与 q 之和均不超过4×105。
输出描述
对于每一组测试数据,新起一行输出一个字符串,表示最终的字符串。
样例1
输入
2
3 2
abc
a b
b c
5 1
abcde
a z
输出
ccc
zbcde
说明
- 初始字符串为"abc";
- 第一次操作将所有的’a’替换为′b’,字符串变为"bbc";
- 第二次操作将所有的’b’替换为’c’,字符串变为"ccc"。。