有乙個括號序列,現在要計算一下它有多少非空子段是合法括號序列。合法括號序列的定義是:
空序列是合法括號序列。
如果 s 是合法括號序列,那麼 (s) 是合法括號序列。
如果 a 和 b 都是合法括號序列,那麼 ab 是合法括號序列。
多組測試資料。第一行有乙個整數 t(1<=t<=1100000) ,表示測試資料的數量。
接下來 t 行,每一行都有乙個括號序列,是乙個由 『(』 和 『)』 組成的非空串。
所有輸入的括號序列的總長度不超過 1100000 。
輸出 t 行,每一行對應乙個測試資料的答案。
5(()
()()
(()(())
013
12
首先預處理出與每乙個左括號所對應的右括號的位置, cn
t[i]
=j表示左括號
i 所對應的右括號的位置為 j。
dp[i
] 代表
i 右側合法括號序列的數目。
則對於每乙個左括號, dp
[i]=
dp[c
nt[i
]+1]
+1,表示每乙個左括號右側合法括號序列數目 等於 與當前匹配的右括號右邊相鄰的左括號(如果有的話)序列數 加 當前這一對的數目。
#include
using
namespace
std;
#define inf 0x3f3f3f3f
const
int maxn = 1200000;
const
int mod = 1e9+7;
typedef
long
long ll;
stack
sk;
int cnt[maxn];
ll ans[maxn];
char str[maxn];
void solve()
for(int i=len-1; i>=0; i--)
}ll res = 0;
for(int i=len-1; i>=0; i--)
}printf("%lld\n",res);
}int main()
}
51nod 1791 合法括號子段
題解 我們可以發現每一對可以匹配的左右括號一定是一一對應的,那麼我們用乙個棧維護即可。如果當前是右括號,棧頂是左括號,那麼一定有1的貢獻,還要加上之前到達過top 1這個位置多少次,因為現在這一對括號可以和之前的那些組成更長的序列。1 include2 include3 include4 defin...
51nod 1791 合法括號子段
有乙個括號序列,現在要計算一下它有多少非空子段是合法括號序列。合法括號序列的定義是 1.空序列是合法括號序列。2.如果s是合法括號序列,那麼 s 是合法括號序列。3.如果a和b都是合法括號序列,那麼ab是合法括號序列。多組測試資料。第一行有乙個整數t 1 t 1100000 表示測試資料的數量。接下...
51nod 1791 合法括號字段
原題連線 51nod 1791 合法括號字段 1791 合法括號子段 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 有乙個括號序列,現在要計算一下它有多少非空子段是合法括號序列。合法括號序列的定義是 1.空序列是合法括號序列。2.如果s是合法括號序列,那麼 s ...