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 翻译