CF1979D Fixing a Binary String

题目描述

给定一个长度为 $n$ 的二进制字符串 $s$,仅包含 $0$ 和 $1$。你可以恰好执行一次如下操作: 1. 选择一个整数 $p$($1 \le p \le n$)。 2. 翻转子串 $s_1 s_2 \ldots s_p$。此步骤后,字符串 $s_1 s_2 \ldots s_n$ 变为 $s_p s_{p-1} \ldots s_1 s_{p+1} s_{p+2} \ldots s_n$。 3. 然后,将字符串 $s$ 向左循环移动 $p$ 次。此步骤后,原始字符串 $s_1s_2 \ldots s_n$ 变为 $s_{p+1}s_{p+2} \ldots s_n s_p s_{p-1} \ldots s_1$。 例如,对字符串 110001100110 选择 $p=3$ 执行操作,第二步后字符串变为 011001100110,第三步后变为 001100110011。 一个字符串 $s$ 被称为 $k$-proper,当且仅当满足以下两个条件: - $s_1=s_2=\ldots=s_k$; - 对于任意 $i$($1 \le i \le n - k$),都有 $s_{i+k} \neq s_i$。 例如,当 $k=3$ 时,字符串 000、111000111 和 111000 是 $k$-proper 的,而 000000、001100 和 1110000 不是。 给定一个整数 $k$,且 $k$ 是 $n$ 的约数。请你找到一个整数 $p$($1 \le p \le n$),使得经过上述操作后,字符串 $s$ 变为 $k$-proper,或者判断是否不可能实现。注意,即使字符串初始时已经是 $k$-proper,也必须恰好执行一次操作。

输入格式

每组测试数据包含多组测试用例。第一行包含一个整数 $t$($1 \le t \le 10^4$),表示测试用例的数量。接下来是每组测试用例的描述。 每组测试用例的第一行包含两个整数 $n$ 和 $k$($1 \le k \le n$,$2 \le n \le 10^5$),表示字符串 $s$ 的长度和 $k$ 的值。保证 $k$ 是 $n$ 的约数。 每组测试用例的第二行包含一个长度为 $n$ 的二进制字符串 $s$,仅包含字符 $0$ 和 $1$。 保证所有测试用例中 $n$ 的总和不超过 $2 \cdot 10^5$。

输出格式

对于每组测试用例,输出一个整数——使字符串变为 $k$-proper 的 $p$ 值,或者如果无法实现则输出 $-1$。 如果有多个解,输出任意一个即可。

说明/提示

在第一个测试用例中,若选择 $p=3$ 执行操作,第二步后字符串变为 11100001,第三步后变为 00001111。该字符串是 $4$-proper 的。 在第二个测试用例中,可以证明不存在任何操作能使字符串变为 $2$-proper。 在第三个测试用例中,若选择 $p=7$ 执行操作,第二步后字符串变为 100011100011,第三步后变为 000111000111。该字符串是 $3$-proper 的。 在第四个测试用例中,无论选择哪个 $p$,操作后字符串都能变为 $5$-proper。 由 ChatGPT 4.1 翻译