思路:根据数据,明显的O(n^2)
用t表示到当前位置有多少个可用的( , 用cnt表示到当前位置出现过多少个 ?
1. s[i]=='(',t++;
s[i]==')' t--
s[i]=='?' t--,cnt++
2.if(t==0)正好匹配
if(t<0 && cnt>0) t+=2,cnt-- 继续匹配
3. if (t<0&& cnt==0) break;后面不可能匹配.
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define MOD 1000000007
#define bug1 cout <<"bug1"<<endl
#define bug2 cout <<"bug2"<<endl
#define bug3 cout <<"bug3"<<endl
using namespace std;
typedef long long ll;
const int MAX_N=5000+3;
char str[MAX_N];
ll ans;
int main(void){
scanf("%s",str+1);
int len=strlen(str+1);
for(int i=1;i<=len;i++){
int l=0,cnt=0;
for(int j=i;j<=len;j++){
if(str[j]=='(') l++;
else if(str[j]==')') l--;
else cnt++,l--;
if(l==0) ans++;
else if(l<0&&cnt>0) cnt--,l+=2;
else if(l>0) continue;
else if(l<0&&!cnt) break;
}
}
cout << ans <<endl;
}