括号序列
題目描述
一個由小括號組成的字符串可以被稱為一個括號序列。但一個括號序列可能并不滿足括號匹配的要求。因此,我們可以進一步將滿足括號匹配的括號序列成為“標準的括號序列。例如字符串")((())"是一個括號序列但不是標準的括號序列,而字符串"()(())"是一個標準的括號序列。給定一個括號序列,你需要對求出:這個括號序列的所有不同的子串中,有多少個是標準的括號序列?
一個括號序列的子串指的是這個序列從某個位置起始、到某個位置截止的子字符串。如果兩個子串擁有不同的起始位置或截止位置,那么它們就被認為是括號序列的不同的子串。
?
?
輸入
包括一行一個字符串,為給定的括號序列。?
輸出
輸出一個整數,為標準的括號序列的子串的個數。?
樣例輸入
()(())樣例輸出
4?
提示
設輸入字符串的長度為n。
對于30%的數據,滿足n≤200。
對于60%的數據,滿足n≤5000。
對于100%的數據,滿足1≤n≤10^6。
題解:題目要求必須是子串,也就是要連續的,因此當前面有一個合法的話,如果緊接著又出現了一個合法的,那么方法數就是(1+1)種,如果前面有n種連續的合法的括號的話,緊接著又出現一個合法的,那么方法數就是(1+n),所以每當遇到一個合法的括號對的時候,看他前面是否有連續的括號對,用stack記錄,用stack.pre來記錄當以這個括號作為兩個連續合法序列的分隔時,這個括號后面有多少個合法的序列。
?
#include <bits/stdc++.h> #define ll long long #define met(a,x) memset(a,x,sizeof(a)) #define inf 0x3f3f3f3f using namespace std; const int N=1e6+10; const int mod=1e9+7; char a[N]; struct node {int x,pre; } b; stack<node> s; int main() {ios::sync_with_stdio(false);cin.tie(0);cin>>a+1;int len=strlen(a+1);ll ans=0;ll sum=0;for(int i=1; i<=len; i++){if(a[i]=='(')b.x=1;elseb.x=2;if(!s.empty()){if(s.top().x==1&&b.x==2){s.pop();if(s.empty()){ans+=(sum+1);sum++;}else{ans+=(s.top().pre+1);s.top().pre++;}}elses.push(b);}elses.push(b);}cout<<ans<<endl;return 0; }?
轉載于:https://www.cnblogs.com/nublity/p/10278933.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
- 上一篇: Chapter第六章
- 下一篇: 百度文库资料下载总结技巧