CF2111E Changing the String

题目描述

给定一个只包含拉丁字母前 $3$ 个字母的字符串 $s$,即字符串中的每个字符都是 $a$、$b$ 或 $c$。 同时给定 $q$ 个操作。每个操作会给出两个字母 $x$ 和 $y$(均为 $a$、$b$ 或 $c$),对于每个操作,必须执行以下两种操作之一: - 将字符串 $s$ 中任意(一个)出现的字母 $x$ 改为字母 $y$(如果 $x$ 至少出现一次); - 什么都不做。 目标是按照给定顺序执行所有操作,使得字符串 $s$ 最终字典序最小。 回忆:如果字符串 $a$ 是字符串 $b$ 的前缀且 $a \neq b$,或者在第一个不同的位置,$a$ 的字母比 $b$ 的对应字母在字母表中更靠前,则称字符串 $a$ 的字典序小于字符串 $b$。

输入格式

每个测试点包含若干组测试数据。第一行包含一个整数 $t$($1 \le t \le 10^{3}$),表示测试数据组数。接下来是每组测试数据的描述。 每组测试数据的第一行包含两个整数 $n$ 和 $q$($1 \le n, q \le 2 \times 10^{5}$),分别表示字符串 $s$ 的长度和操作数。 每组测试数据的第二行给出字符串 $s$,长度恰为 $n$,且每个字符均为 $a$、$b$ 或 $c$。 接下来的 $q$ 行,每行包含两个字符 $x$ 和 $y$,均为 $a$、$b$ 或 $c$,表示一次操作。 额外输入限制: - 所有测试数据中 $n$ 的总和不超过 $2 \times 10^{5}$; - 所有测试数据中 $q$ 的总和不超过 $2 \times 10^{5}$。

输出格式

对于每组测试数据,输出通过给定操作可以得到的字典序最小的字符串。

说明/提示

在第一个测试用例中,两个操作都需要应用在第一个字母上: 1. 第一个操作后,$s = $ "bb" 2. 第二个操作后,$s = $ "ab" 在第二个测试用例中,字符串的变化过程如下: 1. "bbbbabbbbb"(第 $5$ 个字母被修改) 2. "cbbbabbbbb"(第 $1$ 个字母被修改) 3. "cbbbabbbbb"(未做任何操作) 4. "cbbaabbbbb"(第 $4$ 个字母被修改) 5. "abbaabbbbb"(第 $1$ 个字母被修改) 6. "abcaabbbbb"(第 $3$ 个字母被修改) 7. "abcaabbbbb"(未做任何操作) 8. "aacaabbbbb"(第 $2$ 个字母被修改) 9. "aacaabbbbb"(未做任何操作) 10. "aaaaabbbbb"(第 $3$ 个字母被修改) 由 ChatGPT 4.1 翻译