【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;
}
posted @ 2018-01-30 10:54  AWCXV  阅读(174)  评论(0编辑  收藏  举报