#CF1987G1. Spinning Round (Easy Version)

Spinning Round (Easy Version)

CF1987G1 Spinning Round (Easy Version)

题目描述

这是该问题的简单版本。两个版本的区别仅在于 ss 允许的字符。在简单版本中,ss 只包含字符 ?。只有当你同时解决了两个版本的问题时,才能进行 hack。

给定一个长度为 nn 的排列 pp,以及一个长度为 nn 只包含字符 ? 的字符串 ss

对于每个 ii1in1 \le i \le n

  • 定义 lil_i 为最大的下标 j<ij < i,使得 pj>pip_j > p_i。如果不存在这样的 jj,则 li:=il_i := i
  • 定义 rir_i 为最小的下标 j>ij > i,使得 pj>pip_j > p_i。如果不存在这样的 jj,则 ri:=ir_i := i

初始时,你有一个 nn 个点(编号为 11nn)且没有边的无向图。然后,对于每个 ii1in1 \le i \le n,向图中添加一条边:

  • 如果 si=s_i = L,则向图中添加边 (i,li)(i, l_i)
  • 如果 si=s_i = R,则向图中添加边 (i,ri)(i, r_i)
  • 如果 si=?s_i = ?,你可以选择向图中添加边 (i,li)(i, l_i)(i,ri)(i, r_i)

请你求出所有你能构造出的连通图中,可能的最大直径 ^{\ast}。如果无法构造出连通图,输出 1-1

^{\ast}d(s,t)d(s, t) 为点 sstt 之间任意一条路径上最少的边数。

图的直径定义为所有点对 (s,t)(s, t)d(s,t)d(s, t) 的最大值。

输入格式

每组测试数据包含多组测试用例。输入的第一行包含一个整数 tt1t21041 \le t \le 2 \cdot 10^4),表示测试用例的组数。接下来是每组测试用例的描述。

每组测试用例的第一行包含一个整数 nn2n41052 \le n \le 4 \cdot 10^5),表示排列 pp 的长度。

第二行包含 nn 个整数 p1,p2,,pnp_1, p_2, \ldots, p_n1pin1 \le p_i \le n),表示排列 pp 的元素。

第三行包含一个长度为 nn 的字符串 ss,保证只包含字符 ?。

保证所有测试用例中 nn 的总和不超过 41054 \cdot 10^5

输出格式

对于每组测试用例,输出你能构造出的所有连通图中可能的最大直径。如果无法构造出连通图,输出 1-1

输入输出样例 #1

输入 #1

8
5
2 1 4 3 5
?????
2
1 2
??
3
3 1 2
???
7
5 3 1 6 4 2 7
???????
5
5 2 1 3 4
?????
6
6 2 3 4 5 1
??????
8
1 7 5 6 2 8 4 3
????????
12
6 10 7 1 8 5 12 2 11 3 4 9
????????????

输出 #1

4
1
2
6
4
5
5
8

说明/提示

在第一个测试用例中,以下是你可以构造的一些连通图(标签为下标):

在第二个测试用例中,唯一的连通图的直径为 11

由 ChatGPT 4.1 翻译