CF1840E Character Blocking
题目描述
给定两个等长的字符串 $s_1$ 和 $s_2$,均由小写拉丁字母组成,以及一个整数 $t$。
你需要回答 $q$ 个询问,编号从 $1$ 到 $q$。第 $i$ 个询问在第 $i$ 秒时到来。每个询问有三种类型:
- 将两个字符串中第 $pos$ 个位置的字符(下标从 $1$ 开始)同时封锁 $t$ 秒;
- 交换两个未被封锁的字符;
- 判断在当前时刻,忽略被封锁的字符后,两个字符串是否相等。
注意,第二种类型的询问中,被交换的字符可以来自同一个字符串,也可以分别来自 $s_1$ 和 $s_2$。
输入格式
输入的第一行为一个整数 $T$($1 \le T \le 10^4$),表示测试用例的数量。
接下来是每个测试用例的描述。
每个测试用例的第一行为一个字符串 $s_1$,由小写拉丁字母组成(长度不超过 $2 \cdot 10^5$)。
第二行为一个字符串 $s_2$,由小写拉丁字母组成(长度不超过 $2 \cdot 10^5$)。
两个字符串长度相等。
第三行为两个整数 $t$ 和 $q$($1 \le t, q \le 2 \cdot 10^5$)。$t$ 表示字符被封锁的秒数,$q$ 表示询问的数量。
接下来的 $q$ 行,每行一个询问。每个询问有三种类型:
- “$1\ \ pos$”——将两个字符串中第 $pos$ 个字符同时封锁 $t$ 秒;
- “$2\ \ 1/2\ \ pos_1\ \ 1/2\ \ pos_2$”——交换两个未被封锁的字符。第二个数字表示第一个字符来自哪个字符串,第三个数字表示该字符在该字符串中的位置。第四个数字表示第二个字符来自哪个字符串,第五个数字表示该字符在该字符串中的位置;
- “$3$”——判断当前时刻,忽略被封锁的字符后,两个字符串是否相等。
对于第一种类型的询问,保证在询问时,第 $pos$ 个字符未被封锁。
对于第二种类型的询问,保证被交换的字符未被封锁。
所有 $pos, pos_1, pos_2$ 的取值范围均为 $1$ 到字符串长度。
所有测试用例中 $q$ 的总和,以及所有 $s_1$ 的总长度,不超过 $2 \cdot 10^5$。
输出格式
对于每个第三种类型的询问,如果忽略被封锁的字符后,$s_1$ 和 $s_2$ 相等,输出 “YES”,否则输出 “NO”。
你可以输出任意大小写的字母。例如,“yEs”、“yes”、“Yes” 和 “YES” 都会被判为正确答案。
说明/提示
我们来看每次 $q$ 次询问后 $s_1$ 和 $s_2$ 的变化。被封锁的字符用红色表示。
第一个样例输入:
($codeforces$,$codeblocks$)$\rightarrow$($codeforces$,$codeblocks$)$\rightarrow$($code\color{red}{f}orces$,$code\color{red}{b}locks$)$\rightarrow$($code\color{red}{fo}rces$,$code\color{red}{bl}ocks$)$\rightarrow$($code\color{red}{for}ces$,$code\color{red}{blo}cks$)$\rightarrow$($code\color{red}{for}c\color{red}{e}s$,$code\color{red}{blo}c\color{red}{k}s$)$\rightarrow$($code\color{red}{for}c\color{red}{e}s$,$code\color{red}{blo}c\color{red}{k}s$)$\rightarrow$($codef\color{red}{or}c\color{red}{e}s$,$codeb\color{red}{lo}c\color{red}{k}s$)
第二个样例输入:
($cool$,$club$)$\rightarrow$($cuol$,$clob$)$\rightarrow$($cuol$,$cbol$)$\rightarrow$($c\color{red}{u}ol$,$c\color{red}{b}ol$)$\rightarrow$($c\color{red}{u}ol$,$c\color{red}{b}ol$)$\rightarrow$($cuol$,$cbol$)
由 ChatGPT 4.1 翻译