#P13213. [GCJ 2015 Qualification] Dijkstra
[GCJ 2015 Qualification] Dijkstra
Description
荷兰计算机科学家 Edsger Dijkstra 对该领域做出了许多重要贡献,其中包括以他名字命名的最短路径算法。但本题与该算法无关。
你在一次算法考试中因为拼错了 “Dijkstra” 而被扣了一分——你在 d 和 stra 之间写入了一些字符,每个字符都是 、 或 。你准备用四元数(一种实际存在的数系,扩展自复数)来为自己辩解。四元数的乘法结构如下表所示:
要将一个四元数与另一个四元数相乘,请查找第一个四元数所在的行和第二个四元数所在的列。例如,要计算 乘以 ,查找 行和 列,得到 。要计算 乘以 ,查找 行和 列,得到 。
如上例所示,四元数的乘法不是交换律的——即存在某些 和 ,使得 $\mathbf{a} \times \mathbf{b} \neq \mathbf{b} \times \mathbf{a}$。但它满足结合律——对于任意 、 和 ,都有 $\mathbf{a} \times (\mathbf{b} \times \mathbf{c}) = (\mathbf{a} \times \mathbf{b}) \times \mathbf{c}$。
四元数前的负号与通常意义下的负号一致——对于任意四元数 和 ,都有 $-\mathbf{a} \times -\mathbf{b} = \mathbf{a} \times \mathbf{b}$,且 $-\mathbf{a} \times \mathbf{b} = \mathbf{a} \times -\mathbf{b} = -(\mathbf{a} \times \mathbf{b})$。
你想要证明你的拼写错误等价于正确拼写的 ijk,方法是:你能否将由 、、 组成的字符串在两个位置切分,形成三个子串,使得最左边的子串在四元数乘法下约化为 ,中间的子串约化为 ,最右边的子串约化为 。(例如,jij 被解释为 ; 等于 , 等于 ,所以 jij 约化为 。)如果可以做到,你就能拿回那一分。你能找到切分方法吗?
Input Format
输入的第一行包含测试用例数 。接下来有 组测试用例。每组测试用例包含一行,包含两个用空格分隔的整数 和 ,接着一行包含 个字符,每个字符都是 、 或 。注意,字符串中不会出现负号、1 或其他字符。你需要评估的字符串是给定的 个字符重复 次。例如,若 ,,给定字符串为 ,则你的输入字符串为 。
Output Format
对于每组测试用例,输出一行,格式为 Case #x: y,其中 为测试用例编号(从 1 开始), 为 yes 或 no,表示是否可以将字符串切分为三部分,分别约化为 、、,顺序如上所述。
5
2 1
ik
3 1
ijk
3 1
kji
2 6
ji
1 10000
i
Case #1: NO
Case #2: YES
Case #3: NO
Case #4: YES
Case #5: NO
Hint
样例解释
在第 1 组样例中,字符串长度太短,无法切分为三个子串。
在第 2 组样例中,可以直接将字符串切分为 i、j 和 k。
在第 3 组样例中,唯一的切分方式是 k、j、i,这不满足要求。
在第 4 组样例中,字符串为 。可以切分为 (约化为 i)、(约化为 j)、(约化为 k)。
在第 5 组样例中,无论如何切分子串,都无法得到约化为 j 或 k 的部分。
数据范围
- 。
- 。
小数据集(11 分)
- 时间限制:5 秒。
- 。
- 。
大数据集(17 分)
- 时间限制:10 秒。
- 。
- 。
由 ChatGPT 4.1 翻译
京公网安备 11011102002149号