#1448. 循环移位括号序列

    ID: 1448 传统题 1000ms 256MiB 尝试: 4 已通过: 2 难度: 普及 上传者: 标签>贪心基础算法前缀和字符串

循环移位括号序列

题目描述

给定一个长度为 nn 的括号序列 SS。SS 仅由 (、) 和 * 三种字符组成,其中每个 * 都可以独立地变为一个 ( 或 )(每一个 * 的变化情况都不会对其他任何 * 造成影响)。

我们认为一个括号序列是“好的”,当且仅当它满足以下条件: 对于该序列中所有的 * 的每一种可能的变化,都一定存在一种在这个序列末尾恰好添加 kk 个任意括号的方式,使得整个序列成为合法的括号序列。

例如,当 k=3k=3 时,括号序列 (*( 是“好的”。因为:

  • 当 * 变化成 ( 时,序列变为 (((,可以在末尾添加 ))) 使其成为合法的 ((()));
  • 当 * 变化成 ) 时,序列变为 ()(,可以在末尾添加 )() 使其成为合法的 ()()()。

而当 k=3k=3 时,括号序列 *(( 不是“好的”。因为当 * 变化成 ) 时,序列变为 )((,没有任何一种在末尾恰好添加 33 个任意括号的方式能使该括号序列合法。

现在,请你计算出有多少个不同的整数 xx(0≤x<n0 \le x < n),满足:将括号序列 SS 循环左移 xx 位后,形成的新括号序列是“好的”。

输入格式

本题有多组测试数据。

第一行包含一个正整数 TT,表示数据组数。

接下来包含 TT 组数据,每组数据的格式如下:

  • 第一行包含两个正整数 n,kn, k。
  • 第二行包含一个长为 nn 的字符串 SS,表示该括号序列。

输出格式

对于每组测试数据,输出一行,包含一个整数,表示满足条件的 xx 的数量。

样例输入 1

3
3 3
((*
5 1
()(**
10 8
(**)(((((*

样例输出 1

2
0
3

说明

样例解释

对于第一组测试数据:

  • x=0x = 0,此时循环左移后的括号序列为 ((*。
    • 当 * 变化成 ( 时,存在括号序列 ((())) 满足要求;
    • 当 * 变化成 ) 时,存在括号序列 (()()) 满足要求。
  • x=1x = 1,此时括号序列为 (*(。
    • 当 * 变化成 ( 时,存在括号序列 ((())) 满足要求;
    • 当 * 变化成 ) 时,存在括号序列 ()()() 满足要求。
  • x=2x = 2,此时括号序列为 *((。
    • 当 * 变化成 ( 时,存在括号序列 ((())) 满足要求;
    • 当 * 变化成 ) 时,括号序列为 )((,无法通过在末尾添加 33 个括号使其变为合法括号序列。因此,x=2x=2 不合法。

综上,有两个 xx 满足要求,答案为 22。

对于第二组测试数据,不存在任何一个 xx 能满足要求。

对于第三组测试数据,只有 x=4,5,6x = 4, 5, 6 满足要求。

数据范围

对于所有测试数据,保证:

  • 1≤T≤101 \le T \le 10
  • 1≤n,k≤1061 \le n, k \le 10^6
  • (n+k) mod 2=0(n+k) \bmod 2 = 0
  • SS 仅由 (、) 和 * 三种字符组成。

各测试点的附加限制如下表所示:

测试点编号 T≤T \le n,k≤n,k \le 特殊性质
11 1010 无
22 55
3∼43 \sim 4 11 10310^3
5∼65 \sim 6 55
77 10510^5 A
88 B
99 C
1010 无
11∼1211 \sim 12 11 10610^6
1313 55 A
1414 B
1515 C
16∼2516 \sim 25 1010 无
  • 特殊性质 A:保证 n=kn = k。
  • 特殊性质 B:保证 SS 仅由 ( 和 ) 组成。
  • 特殊性质 C:保证 SS 仅由 ( 和 * 组成。