CF1800E2 Unforgivable Curse (hard version)

题目描述

这是该问题的复杂版本。本版本对 $k$ 的数值没有额外限制。 Wizengamot 的首席巫师曾经抓住了邪恶巫师 Drahyrt,但邪恶巫师已经归来,并想要向首席巫师复仇。因此他从学生 Harry 那里偷走了咒语 $s$。 这个咒语是一个长度为 $n$ 的小写拉丁字母字符串。 Drahyrt 想要用一个不可饶恕的咒语——字符串 $t$——来替换原有的咒语。 Drahyrt 可以利用古老的魔法,无限次地交换咒语中距离为 $k$ 或 $k+1$ 的字母。换句话说,Drahyrt 可以交换咒语 $s$ 中第 $i$ 位和第 $j$ 位的字母,当且仅当 $|i-j|=k$ 或 $|i-j|=k+1$。 例如,如果 $k=3, s=$ "talant",$t=$ "atltna",Drahyrt 可以按如下方式操作: - 交换第 $1$ 位和第 $4$ 位的字母,得到咒语 "aaltnt"。 - 交换第 $2$ 位和第 $6$ 位的字母,得到咒语 "atltna"。 现在给定咒语 $s$ 和 $t$,你能判断 Drahyrt 能否通过上述操作将咒语 $s$ 变为 $t$ 吗?

输入格式

输入的第一行包含一个整数 $T$($1 \le T \le 10^4$),表示测试用例的数量。 接下来是每个测试用例的描述。 每个测试用例的第一行包含两个整数 $n, k$($1 \le n \le 2 \cdot 10^5$,$1 \le k \le 2 \cdot 10^5$),表示咒语的长度和 Drahyrt 可以交换的距离 $k$。 第二行给出咒语 $s$,是一个长度为 $n$ 的小写拉丁字母字符串。 第三行给出咒语 $t$,是一个长度为 $n$ 的小写拉丁字母字符串。 保证所有测试用例中 $n$ 的总和不超过 $2 \cdot 10^5$。注意,所有测试用例中 $k$ 的总和没有限制。

输出格式

对于每个测试用例,输出一行 "YES"(不区分大小写),如果 Drahyrt 能够将咒语 $s$ 变为 $t$,否则输出 "NO"。 你可以用任意大小写输出答案(例如 "yEs"、"yes"、"Yes" 和 "YES" 都会被认为是正确的肯定答案)。

说明/提示

第一个样例在题面中已经解释。 第二个样例中,我们可以交换相邻的字母,因此可以用冒泡排序等方法对字符串进行排序。 第三个样例中,可以证明无法通过交换距离为 $6$ 或 $7$ 的字母将字符串 $s$ 变为 $t$。 第四个样例中,例如可以按如下变换序列操作: - "accio" $\rightarrow$ "aocic" $\rightarrow$ "cocia" $\rightarrow$ "iocca" $\rightarrow$ "aocci" $\rightarrow$ "aicco" $\rightarrow$ "cicao" 第五个样例中,可以证明无法通过上述操作将 $s$ 变为 $t$。 第六个样例中,只需交换最外侧的两个字母即可。 由 ChatGPT 4.1 翻译