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;
}