【Codeforces Round #459 (Div. 2) C】The Monster

本文介绍了一种通过将左括号视为1、右括号视为-1的方法来解决括号匹配问题的算法。该算法利用两个变量l和r分别记录前i个字符的累积和的最小和最大可能值,通过遍历字符串并更新这两个变量来确定所有可能的匹配情况。

【链接】 我是链接,点我呀:)
【题意】


在这里输入题意

【题解】


左括号看成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;
}

转载于:https://www.cnblogs.com/AWCXV/p/8384019.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值