交互题 2000ms 256MiB

括号 2

该比赛已结束,您无法在比赛模式下递交该题目。您可以点击“在题库中打开”以普通模式查看和递交本题。

Problem Description

为什么出题人那么热衷于出和括号有关的题呢?

本题为交互题。

给定一个长度为 $2n$ 的正则括号序列 $s$。

系统暗中选定一个位置 $p$($1 \le p \le 2n$),将该位置的字符翻转——`(` 变成 `)` 或 `)` 变成 `(`。翻转后的串记为 $t$。你不知道 $p$ 的值。

你可以向系统提出询问。每次询问需指定两个字符串 $s_1, s_2$ 和一个区间 $[l, r]$,格式如下:

$?\ s_1\ l\ r\ s_2$

系统会将 $s_1$、$t[l \ldots r]$、$s_2$ 顺次拼接,然后回答该拼接串是否为正则括号序列(`YES` 或 `NO`)。

你需要找出 $p$。每组数据至多进行 $15$ 次询问。

仅由 `(` 和 `)` 构成的字符串称为正则括号序列(balanced bracket sequence),当且仅当满足以下归纳定义:

$\quad$· 空串 $\varepsilon$ 是正则括号序列;

$\quad$· 若 $A$ 是正则括号序列,则 $\texttt{(} A \texttt{)}$ 也是正则括号序列;

$\quad$· 若 $A, B$ 都是正则括号序列,则 $AB$ 也是正则括号序列。

Input Format

第一行一个整数 $T$($1 \le T \le 1000$),表示测试数据组数。

对于每组数据:

第一行一个整数 $n$($2 \le n \le 5000$)。

第二行一个长度为 $2n$ 的字符串 $s$,保证 $s$ 是正则括号序列。

保证所有数据满足 $\sum n \le 5000$。

Output Format

每组数据中,你可以进行至多 $15$ 次询问。每次询问输出一行:

$?\ s_1\ l\ r\ s_2$

其中 $s_1, s_2$ 是仅由 `(` 和 `)` 组成的非空字符串,且 $1 \le |s_1|, |s_2| \le 2n$;$l, r$ 是下标,满足 $1 \le l \le r \le 2n$。四个部分以空格分隔

系统收到询问后,回答一行 `YES` 或 `NO`。

当你确定答案后,输出:

$!\ p$

表示被翻转的位置。此行不计入询问次数。

每组数据处理完毕后请立即进入下一组。若询问次数超过 $15$、询问格式有误或答案错误,系统将回答 $-1$;收到 $-1$ 后你必须立即终止程序。

你在每次输出查询语句换行后,可以使用如下代码刷新缓冲区:

C++ 使用 fflush(stdout);

Java 使用 System.out.flush();

Python 使用 stdout.flush();

Pascal 使用 flush(output);

其它语言请参考相关文档。

1
2
(())
? ( 1 2 )))
? ((( 3 4 )
! 2

Hint

$n = 2$,$s = \texttt{(())}$,系统翻转位置 $2$(`(` 变 `)`),得到 $t = \texttt{()))}$。

选手输出 | 系统应答 | 说明

:--- | :--- | :---

`? ( 1 2 )))` | `NO` | 拼接 $\texttt{(} + t[1, 2] + \texttt{)))} = \texttt{(()))}$ 不是正则括号序列,故 $p \in [1, 2]$

`? ((( 3 4 )` | `YES` | 拼接 $\texttt{(((} + t[3, 4] + \texttt{)} = \texttt{((()))}$ 是正则括号序列,故 $p \notin [3, 4]$

`! 2` | | 结合两次结果得 $p=2$

江南程序设计竞赛联盟暑期多校训练·第一场

未参加
状态
已结束
规则
XCPC
题目
12
开始于
2026-7-16 12:00
结束于
2026-7-16 17:00
持续时间
5 小时
主持人
参赛人数
126