题目源:Educational Codeforces Round 125 (Rated for Div. 2)
题意
一个由 '(' 和 ')'组成的长度为n的字符串,每次操作要删除这个字符串的最短好前缀,输出删除的次数和最后剩下的无法删除的字符个数
好前缀是满足下列任意一个条件的前缀:
- 前缀是正常组成的括号(按正常逻辑组成)
- 前缀是回文
思路
按照如下方法将满足要求的前缀删去:
- 当前字符为'('时,第二个字符是什么都能满足规定的字符串,操作数+1并进行下一步操作。
- 当前字符为')'时,不满足正常组成括号,寻找最近的下一个')'字符,它们和它们之间的字符组成回文,操作数+1并进行下一步操作。
代码
#include<iostream>
using namespace std;
int main()
{
int T,n,ans,k,j;
string s;
cin>>T;
for(int i=0;i<T;i++)
{
cin>>n;
cin>>s;
ans=0;
for(j=0;j<n-1;)
{
if(s[j]=='(')
{
j+=2;
ans++;
}
else
{
k=j+1;
while(k<n&&s[k]=='(') k++;
if(k==n) break;
j=k+1;
ans++;
}
}
cout<<ans<<" "<<n-j<<endl;
}
return 0;
}