【堆栈模板】括号序列
题目描述
一个由小括号组成的字符串可以被称为一个括号序列。但一个括号序列可能并不满足括号匹配的要求。因此,我们可以进一步将满足括号匹配的括号序列成为“标准的括号序列。例如字符串")((())"是一个括号序列但不是标准的括号序列,而字符串"()(())"是一个标准的括号序列。
给定一个括号序列,你需要对求出:这个括号序列的所有不同的子串中,有多少个是标准的括号序列?
一个括号序列的子串指的是这个序列从某个位置起始、到某个位置截止的子字符串。如果两个子串拥有不同的起始位置或截止位置,那么它们就被认为是括号序列的不同的子串。
给定一个括号序列,你需要对求出:这个括号序列的所有不同的子串中,有多少个是标准的括号序列?
一个括号序列的子串指的是这个序列从某个位置起始、到某个位置截止的子字符串。如果两个子串拥有不同的起始位置或截止位置,那么它们就被认为是括号序列的不同的子串。
输入
包括一行一个字符串,为给定的括号序列。
输出
输出一个整数,为标准的括号序列的子串的个数。
#include <bits/stdc++.h> #define ll long long using namespace std; char s[1000005]; stack<pair<int,int> > ps; int pre,ant; int main() { scanf("%s",s); int len=strlen(s); for(int i=0;i<len;i++) { pair<int,int> now; if(s[i]=='(') now.first=1; else now.first=0; if(!ps.empty()) { if(ps.top().first==1&&!now.first) { ps.pop(); if(ps.empty()) { ant+=(pre+1); pre++; } else { ant+=(ps.top().second+1); ps.top().second++; } } else { ps.push(now); } } else { ps.push(now); } } printf("%d\n",ant); return 0; }