Mehmet 非常喜欢电脑游戏,过去 10 个小时里一直在玩 Immortal Grasshopper。Immortal Grasshopper 是一款通过按键控制角色的电脑游戏,你的角色是一只身为空手道大师的蚱蜢。你面对的对手是一只由电脑控制的蚂蚁。
蚱蜢总共能够进行 $S$($1 \le S \le 4$)种不同的攻击。这些攻击用字母表中的前 $S$ 个字母命名。例如:
- $S = 2$:攻击名称为 $A$、$B$。
- $S = 4$:攻击名称为 $A$、$B$、$C$、$D$。
每次命中对手的攻击造成 1 点伤害。
虽然你知道游戏规则,但 Mehmet 玩了 10 个小时后睡着了,所以没有人能教你如何操作。你在桌上发现了一个有 $N$ 个按键的控制器(按键编号为 $0$ 到 $N - 1$)。玩了一会儿后,你发现每个按键都能进行 $S$ 种不同攻击中的一种,但你不知道各个按键分别对应哪种攻击。幸运的是,第一个按键上的贴纸告诉你,它会进行 $A$ 型攻击。此外,你知道每种不同的攻击都至少对应一个按键。
你的任务是通过玩这个游戏,确定控制器上的所有按键分别进行哪种攻击。
你按照以下方式玩游戏。为了攻击对手蚂蚁,你使用称为连招的连续按键组合。连招的规则如下:
- 你可以依次按下任意数量的按键来组成连招。
- 在一个连招内,你可以按任意顺序按下按键。
- 在一个连招中,同一个按键可以按下多次。
- 一个连招的长度最多为 $400$。
游戏会执行你的操作,最后显示你造成的总伤害。
一个连招对蚂蚁造成的伤害按以下方式计算。令 $t(X)$ 表示按字母顺序紧接在攻击 $X$ 后面的攻击。对于最后一个字母表示的攻击,$t(X)$ 定义为攻击 $A$。例如:
- 当 $S = 4$ 时:$t(A) = B$、$t(B) = C$、$t(C) = D$、$t(D) = A$。
- 当 $S = 2$ 时:$t(A) = B$、$t(B) = A$。
对手蚂蚁会用狡猾的战术抵挡你的部分攻击。具体而言,如果上一次成功(未被格挡)并造成伤害的攻击是 $X$,而下一次攻击是 $t(X)$,那么蚂蚁会格挡这次 $t(X)$ 攻击,你不会造成伤害。如果蚂蚁无法格挡,你就会对它造成 1 点伤害(第一次攻击总会造成伤害)。
你的目标是使用尽可能少的连招,找出并报告所有按键分别对应哪种攻击。
实现细节
你需要实现以下函数:
std::string olumsuz_cekirge(int N, int S)
- $N$ 表示控制器上按键的数量。
- $S$ 表示游戏中不同攻击类型的数量。
- 该函数应返回一个长度为 $N$ 的字符串,表示分配给各个按键的攻击。
在此过程中,你可以使用以下 kombo 函数:
int kombo(std::vector<int> buton)
- 在每次
olumsuz_cekirge调用期间,你最多可以调用 $400$ 次kombo函数。 buton数组指定你希望在连招中使用的按键的编号。buton数组的值必须是 $0$ 到 $N - 1$ 之间的整数。buton数组的长度最多为 $400$。
在每个测试中,你需要解决 $T$ 个独立场景,这些场景的 $N$ 和 $S$ 的值相同。对于每个独立场景,olumsuz_cekirge 函数会被调用一次。
数据范围
- $1 \le T \le 100$。
- $4 \le N \le 400$。
- $1 \le S \le 4$。
- 评测程序不具有自适应性。具体而言,输入在调用
olumsuz_cekirge函数之前就已固定,且不会在操作过程中发生改变。
子任务
如果在任何一个场景中,调用 kombo 函数时传入的参数不满足上述条件,或者 olumsuz_cekirge 函数返回了错误的结果,那么第 $i$ 个子任务的得分为 $0$。否则,得分按以下公式计算:
$$P_i \times \min\left(1,\left(\frac{400-q}{400-Q_i}\right)^3\right)$$
- $P_i$ 表示第 $i$ 个子任务可获得的总分。
- $q$ 表示第 $i$ 个子任务的所有测试中的各个场景里,
kombo函数调用次数的最大值。 - $Q_i$ 的值在子任务说明中给出。
| 子任务 | 分值 | 附加限制 | 依赖子任务 |
|---|---|---|---|
| 1 | 1 | $S = 1, Q_1 = 0, P_1 = 1$ | — |
| 2 | 15 | $S = 2, Q_2 = 50, P_2 = 15$ | — |
| 3 | 40 | $S = 3, Q_3 = 80, P_3 = 40$ | — |
| 4 | 44 | $S = 4, Q_4 = 103, P_4 = 44$ | — |
样例
olumsuz_cekirge(6, 3)
在这些样例中,各个按键依次对应的攻击是 ABCBBA,因此该函数应返回这个字符串。
kombo([0, 1, 2])
上面的调用返回 $2$。这个连招中的攻击为 $ABC$。第一次 $A$ 攻击命中,$B$ 攻击被格挡。由于上一次造成伤害的攻击是 $A$,蚂蚁无法格挡 $C$ 攻击,因此受到伤害。
kombo([0, 0, 0])
上面的调用返回 $3$。这个连招中的攻击为 $AAA$。所有 $A$ 攻击都造成伤害。
kombo([5, 1, 3, 2, 2, 0])
上面的调用返回 $3$。这个连招中的攻击为 $ABBCCA$。第一次 $A$ 攻击命中,$B$ 攻击被格挡。由于上一次命中的攻击仍然是 $A$,第二次 $B$ 攻击也被格挡。第一次和第二次 $C$ 攻击都造成伤害。由于上一次命中的攻击是 $C$,对手蚂蚁预判了 $A$,因此最后的 $A$ 攻击被格挡。
kombo([2, 2, 1])
上面的调用返回 $3$。这个连招中的攻击为 $CCB$。所有攻击都造成伤害。
样例评测程序
样例评测程序按以下格式读取输入,其中 $C_i$ 是一个长度为 $N$ 的字符串,表示第 $i$ 个场景中各个按键所对应的秘密攻击:
$$\begin{gathered}T\ N\ S\\C_1\\C_2\\\ldots\\C_T\end{gathered}$$
对于每个场景,评测程序会输出以下内容:如果正确解决了该场景,则输出使用的操作总数。如果出现错误,则输出以下错误信息之一:
Yanlis cevap (Wrong answer) Buton asildi (Button limit exceeded) Yanlis buton (Invalid button) Kombo asildi (Combo limit exceeded)
Yanlis cevap (Wrong answer)(答案错误):如果任何一个按键的答案有误,则输出此信息。Buton asildi (Button limit exceeded)(超过按键数量限制):如果在一次kombo函数调用中使用了超过 $400$ 个按键,则返回此信息。Yanlis buton (Invalid button)(无效按键):如果在一次kombo函数调用中,某个按键编号不在 $0$ 到 $N - 1$ 之间,则返回此信息。Kombo asildi (Combo limit exceeded)(超过连招数量限制):如果在一次olumsuz_cekirge函数调用期间,调用kombo函数超过 $400$ 次,则返回此信息。