CF1905C Largest Subsequence

题目描述

给定一个长度为 $n$ 的字符串 $s$。每次操作你可以选择字符串 $s$ 的字典序最大的子序列,并将其循环右移一次。 你的任务是计算将 $s$ 变为有序所需的最少操作次数,或者报告它永远无法达到有序状态。 $^\dagger$ 若字符串 $a$ 是字符串 $b$ 的前缀且 $a \ne b$,或者在第一个不同的位置上,$a$ 的字母在字母表中比 $b$ 的对应字母更靠前,则称字符串 $a$ 的字典序小于字符串 $b$。 $^\ddagger$ 将字符串 $t_1t_2\ldots t_m$ 循环右移一次,得到的字符串为 $t_m t_1 \ldots t_{m-1}$。

输入格式

每组测试包含多个测试用例。第一行包含一个整数 $t$($1 \le t \le 10^4$),表示测试用例的数量。接下来是每个测试用例的描述。 每个测试用例的第一行包含一个整数 $n$($1 \le n \le 2 \times 10^5$),表示字符串 $s$ 的长度。 每个测试用例的第二行包含一个长度为 $n$ 的字符串 $s$,仅由小写英文字母组成。 保证所有测试用例中 $n$ 的总和不超过 $2 \times 10^5$。

输出格式

对于每个测试用例,输出一个整数,表示将 $s$ 变为有序所需的最少操作次数。如果不可能变为有序,输出 $-1$。

说明/提示

在第一个测试用例中,字符串 $s$ 已经有序,因此不需要任何操作。 在第二个测试用例中,进行一次操作,我们选择 cb 并将其循环右移。此时字符串 $s$ 变为 abc,已经有序。 在第三个测试用例中,$s$ 无法变为有序。 在第四个测试用例中,我们将执行如下操作: - 字典序最大的子序列是 zca。此时 $s$ 变为 abzc。 - 字典序最大的子序列是 zc。此时 $s$ 变为 abcz,字符串变为有序。 因此,需要 $2$ 次操作。 由 ChatGPT 4.1 翻译