题目链接:http://codeforces.com/contest/918/problem/C
题目大意:给你一串字符串,其中有'('、')'、'?'三种字符'?'可以当成'('或者')'来用,问该字符串中有多少子串符合括号匹配的规则。
解题思路:根据括号匹配原始版进行改进,设置high和low分别表示未匹配左括号数的上限和下限,当遇到'('时low++,high++,遇到')'时low--,high--,遇到'?'时由于既可以表示'('又可以表示')',所以high++,low--。
原始版括号匹配(top为未匹配左括号数):
1 bool check(string s) { 2 int top = 0; 3 for(int i = 0; i < s.size(); ++i) { 4 if(s[i] == '(') top++; 5 else top--; 6 if(cnt < 0) return false; 7 } 8 return cnt == 0; 9 }
本题代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 7 int main(){ 8 int low,high,size; 9 string str; 10 cin>>str; 11 size=str.size(); 12 int ans=0; 13 for(int i=0;i<size;i++){ 14 low=high=0; 15 for(int j=i;j<size;j++){ 16 if(str[j]=='(') high++,low++; 17 if(str[j]==')') high--,low--; 18 if(str[j]=='?') high++,low--; 19 if(high<0) 20 break; 21 if(low<0) low=0; 22 if((j-i)%2&&low==0) 23 ans++; 24 } 25 } 26 printf("%d ",ans); 27 return 0; 28 }