Educational Codeforces Round 125 (Rated for Div. 2)
题目
给出一个长度为n的由(
)
两个字符组成的字符串,每次可以执行以下两操作中的一个:
- 删去前缀中最短的一个回文字符串
- 删去前缀中最短的一个 regular bracket sequence
regular bracket sequence:A bracket sequence is called regular if it is possible to obtain a correct arithmetic expression by inserting characters ‘+’ and ‘1’ into this sequence. For example, sequences (())(), () and (()(())) are regular, while )(, (() and (()))( are not.
回答:最多需要执行以上操作几次之后,该操作无法继续进行或者字符串以为空。并输出执行操作的次数以及最终字符串的长度。
输入
5
2
()
3
())
4
((((
5
)((()
6
)((()(
输出
1 0
1 1
2 0
1 0
1 1
题解
双指针。最短前缀无非两种情况:
- 第一个字符为
(
如果这个字符不是最后一个,那么要么是删去()
,要么是删去((
。所以直接i += 2
即可。 - 第一个字符为
)
则只需要找到另一个)
拼凑出一个回文字符串即可。
CODE
int main()
{
IOS;
int T; cin >> T;
while (T--)
{
int n; cin >> n;
string s; cin >> s;
int i = 0, k = 0;
while (i < n - 1)
{
if (s[i] == '(')
{
i += 2;
k++;
}
else
{
int j = i + 1;
while (j < n && s[j] != ')')
j++;
if (j == n) break;//注意:如果没有找到')',应当break掉
k++;
i = j + 1;
}
}
cout << k << " " << n - i << endl;
}
return 0;
}
双指针也太强大了吧,我竟然在写马拉车算法去判断回文串。。。掉分!!!掉分!!!