注:下文“(没)有合法括号序列”指“这个字符串(没)有(连续的)子串属于合法括号序列。”
我赛时想到的做法是先用不超过 19 次询问找到一个左括号的位置(先看看整个序列是不是没有合法括号序列,如果没有,则最后一个位置一定是 (
,否则,像线段树一样每次当前区间从中间分开形成两个区间,如果两个区间都没有合法括号序列,则左边子区间右端点是 (
,否则将当前区间变为两个子区间中任意一个有合法括号序列的区间,直到当前区间长度为 2,此时当前区间左端点是 (
);
然后用一个类似二进制编码的思想,每 8 个一组,每个位置若干个 ((
加上当前位置的字符的组合((((
或(()
)拼接,根据结果的二进制位确定每个位置是 (
还是 )
,赛时没做出来,第二天做出来了;
然后想到了可以每组 13 个,每次每个位置是若干个 ()
,然后用 (
分割,因为 x 个 ()
拼接会产生 2x(x+1) 个合法括号序列,只要保证每个位置产生的合法括号序列数量大于这组前面所有位置产生的合法括号序列数量,就能区分答案是由哪几部分贡献得到,也就能确认每个位置是 (
还是 )
;
这个做法最坏情况下要用 96 次询问,然而在评测记录中,我看到题解貌似用 88 次询问就得到了这个字符串,请问题解是怎么做到这样的?