51nod 1791 合法括號字段

2021-08-07 07:20:22 字數 1250 閱讀 6235

原題連線 51nod_1791 合法括號字段

1791 合法括號子段

基準時間限制:1 秒 空間限制:131072 kb 分值: 40 難度:4級演算法題

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

合法括號序列的定義是:

1.空序列是合法括號序列。

2.如果s是合法括號序列,那麼(s)是合法括號序列。

3.如果a和b都是合法括號序列,那麼ab是合法括號序列。

input

多組測試資料。

第一行有乙個整數t(1<=t<=1100000),表示測試資料的數量。

接下來t行,每一行都有乙個括號序列,是乙個由』(『和』)』組成的非空串。

所有輸入的括號序列的總長度不超過1100000。

output

輸出t行,每一行對應乙個測試資料的答案。

input示例

5 (

() ()()

(()

(())

output示例

0 1

3 1

2思路:連續的匹配括號可以組合成新的合法括號序列

統計連續的匹配括號 計算序列的個數

#include 

#define max_ 1100010

#define ll long long

using

namespace

std;

stack

s;char sent[1100010];

int main(int argc, char

const *argv)

else

if(s.top()=='|')

else

break;

}ans+=(cnt+1)*cnt/2;//連續的cnt個括號可以組成的總數

if(s.size())

else

s.push(sent[i]);

}else

s.push(sent[i]);

}else

s.push(sent[i]);}}

cnt=0;

while(s.size())//計算棧裡剩餘的數量

else

break;

}ans+=(cnt+1)*cnt/2;

}else

}printf("%lld\n",ans);

}return

0;}

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 合法括號子段 (dp)

有乙個括號序列,現在要計算一下它有多少非空子段是合法括號序列。合法括號序列的定義是 空序列是合法括號序列。如果 s 是合法括號序列,那麼 s 是合法括號序列。如果 a 和 b 都是合法括號序列,那麼 ab 是合法括號序列。多組測試資料。第一行有乙個整數 t 1 t 1100000 表示測試資料的數量...