【Codeforces Round #459 (Div. 2) C】The Monster
【链接】 我是链接,点我呀:)
【题意】
【题解】
左括号看成1 右括号看成-1 设置l,r表示前i个数的和的上下界 遇到 左括号 l和r同时加1 遇到右括号 同时减1 遇到问号 因为问号可以为1或-1所以l减1而r加1 如果在某个时刻r小于0了 就说明再也不能继续了 因为说明左括号和问号比右括号来得少了如果l<0则把l置为0,因为不允许和出现<0的情况
否则如果l等于0就说明有一种方法能让前i个数的和为0
当然当前枚举的序列长度要为偶数
【代码】
#include <bits/stdc++.h>
using namespace std;
const int N = 5e3;
char s[N+10];
int n;
int main(){
#ifdef LOCAL_DEFINE
freopen("rush_in.txt", "r", stdin);
#endif
ios::sync_with_stdio(0),cin.tie(0);
cin >>(s+1);
n = strlen(s+1);
int ans = 0;
for (int i = 1;i <= n;i++){
int l = 0,r = 0;
for (int j = i;j <= n;j++){
if (s[j]=='('){
l++,r++;
}else if (s[j]==')'){
l--,r--;
}else if (s[j]=='?') {
l--,r++;
}
if (r<0) break;
if (l<0) l = 0;
if (l==0 && ((j-i+1)%2==0)) ans++;
}
}
cout<<ans<<endl;
return 0;
}