The Monster CodeForces - 918C

http://codeforces.com/contest/918/problem/C

借鉴的很巧妙的方法

普通括号匹配开一个变量就够 但是这里有问号 随便决定它的朝向肯定不对 可以将还剩多少左括号这个具体值变为一个值域 详见注释

#include <bits/stdc++.h>
using namespace std;

int n;
char ch[5010];

int main()
{
    int i,j,l,r,ans;
    scanf("%s",ch);
    n=strlen(ch),ans=0;
    for(i=0;i<n;i++)
    {
        l=0,r=0;
        for(j=i;j<n;j++)
        {
            if(ch[j]=='(') l++,r++;
            else if(ch[j]==')') l--,r--;
            else l--,r++;//朝左或右都有可能
            if(r<0) break;//当最大值都小于零时说明就算加上问号也无法完成匹配 该段已经非法
            if(l<0) l=0;//若最大值大于等于零而最小值小于零 则说明有未匹配的问号 朝向暂时不明 但是肯定不能向左
            if((j-i+1)%2==0&&l==0) ans++;//此时如果有多余括号 在长度为偶数时自动匹配一下就好
        }
    }
    printf("%d\n",ans);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/sunyutian1998/article/details/82492771
今日推荐