51nod 1791 合法括號子段 (dp)

2021-08-08 15:54:54 字數 1261 閱讀 9785

有乙個括號序列,現在要計算一下它有多少非空子段是合法括號序列。

合法括號序列的定義是:

空序列是合法括號序列。

如果 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 ...