Codeforces Round #459 (Div. 2) C. The Monster(括號,問號變換,思維題,列舉題)
As Will is stuck in the Upside Down, he can still communicate with his mom, Joyce, through the Christmas lights (he can turn them on and off with his mind). He can't directly tell his mom where he is, because the monster that took him to the Upside Down will know and relocate him.
Thus, he came up with a puzzle to tell his mom his coordinates. His coordinates are the answer to the following problem.
A string consisting only of parentheses ('(' and ')') is called a bracket sequence. Some bracket sequence are called correct bracket sequences. More formally:
- Empty string is a correct bracket sequence.
- if s is a correct bracket sequence, then (s) is also a correct bracket sequence.
- if s and t are correct bracket sequences, then st
A string consisting of parentheses and question marks ('?') is called pretty if and only if there's a way to replace each question mark with either '(' or ')' such that the resulting string is a non-empty correct bracket sequence.
Will gave his mom a string s
Joyce doesn't know anything about bracket sequences, so she asked for your help.
InputThe first and only line of input contains string s, consisting only of characters '(', ')' and '?' (2 ≤ |s| ≤ 5000).
OutputPrint the answer to Will's puzzle in the first and only line of output.
Examplesinput((?))output
4input
??()??output
7Note
For the first sample testcase, the pretty substrings of s are:
- "(?" which can be transformed to "()".
- "?)" which can be transformed to "()".
- "((?)" which can be transformed to "(())".
- "(?))" which can be transformed to "(())".
For the second sample testcase, the pretty substrings of s are:
- "??" which can be transformed to "()".
- "()".
- "??()" which can be transformed to "()()".
- "?()?" which can be transformed to "(())".
- "??" which can be transformed to "()".
- "()??" which can be transformed to "()()".
- "??()??" which can be transformed to "()()()".
題意: 給出字串,有括號 (),問號 ?,三種字元,問號可以變換為括號,看看能有多少個正確完美的子字串,正確完美子字串樣式可以重複計算,但同一位置的子串只能算一次;
思路:可以看做列舉每一個區間,看當前區間的字串,能不能組成完美字串;也可以看做是包含當前字元的完美子串有多少個;
先把列舉到的問號?字元,都變為右括號,定義 top,num,num表示當前問號 '?' 變為右括號 ')' 的個數;當遇到 '(',top ++;當遇到 ')',top --,當遇到問號的話,先變為 右括號 ')',top--,num++;
程式碼:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
// 可以說是包含當前這個字元的有多少個正確的子串,
//也可以說是列舉每一個區間,看當前區間,能否組成正確的子串,統計的子串樣式可以重複;
char str[5050];
int main()
{
int i,j;
while( ~scanf( "%s",str ) )
{
int l = strlen(str);
int sum = 0;
for(i = 0; i < l; i ++) // 列舉當前字元;也可以說是列舉每一個區間;
{
int top = 0,num = 0;
for(j = i; j < l; j ++) // 看包含這個字元的有多少個子串
{
if(str[j] == '(') top ++;
else if(str[j] == ')') top --;
else if(str[j] == '?') num ++,top --;
if(top<0&&!num) break;
if(top<0&&num) top += 2,num --;
if(!top) sum ++;
}
}
printf("%d\n",sum);
}
return 0;
}