題解 括號序列 棧

2022-02-19 18:44:55 字數 1267 閱讀 6488

可以猜到,ssw02爆0了

ssw02要懟一下 y - - ,資料和標程都是反的,題還換錯了一道,t2做了一半換題意,s----,emmm

題目出現了九條老師..... 然後發現一句經典,不要先開題面 有九條、我妻、.....

輸入 就是一行字串了

輸出 就是方案數了

我們先用棧來判斷是否合法,想著騙分,然後

咦?這個東西,可以簡化吧。

然後我們發現 , 在 n^2 暴力列舉的基礎上,可以優化 。

具體而言,就是 , 如果存在一種合法區間[ l , r ],那麼一定會導致 l-1 時刻 和 r+1 時刻的棧完全相同 。

然後我們發現,這樣相同的棧就像埠一樣,可以相互搭配 。

就是如果有 k 個相同的埠 , 就有 k*( k-1 )/2 的貢獻方案 ,至於比較 ,hash一下就好了

順便一提,可以記錄之前的狀態,在出棧時直接把hash值賦為歷史值即可避免出棧時無法連續hash的問題。

然後 , ssw02驚奇地發現 , 題目變水了

#includeusing namespace std ;

#define ull unsigned long long

const int maxn = 100005 , base = 1007 , mod = 998244353 ;

int a[ maxn ] , st[ maxn ], n ;

ull num[ maxn ] , top[ maxn ];

char g[ maxn ] ;

int main()

else st[ ++head ] = a[ i ] ;

} if( head )

for( register int i = 1 ; i <= n ; ++i )

st[ ++head ] = a[ i ] ;

top[ head ] = i ;

num[ i ] = (ull)num[ i-1 ]*base + (ull)a[ i ] ;

} //for( register int i = 1 ; i <= n ; ++i )cout

ull ans = 0 ; ull l = 0 , r = 0 ;

while( r <= n )

cout

}

括號序列(棧)

定義滿足以下規則字串為規則序列,否則不是規則序列 1 空序列是規則序列 2 如果s是規則序列,那麼 s s 和也是規則序列 3 如果a和b都是規則序列,那麼ab也是規則序列。例如,下面的字串都是規則序列 而以下幾個則不是 現在,給你一些由 構成的字串,請判斷該字串是否為規則序列。第一行 乙個正整數n...

最長合法括號序列 棧(括號題)

這是另一道處理合法括號序列的題目。我們應該提醒你,如果乙個括號序列插入 和 1 後,可以得到乙個正 確的數學表示式,那麼它被稱為 合法 的。例如,序列 和 是合法的,但 和 不是。給出乙個由 和 字元組成的字串。你要找出它最長的是合法括號序列的子串,也同樣要找出最長子串的個數。括號題容易想到棧,把左...

出棧序列(棧和佇列)

description 已知自然數1,2,n 1 n 10000 依次入棧 即ainput 輸入資料報含若干組測試樣例。每組測試樣例的第一行為整數n 1 n 10000 第二行為n個正整數,以空格隔開,為出棧序列 輸入資料的末尾以乙個0表示輸入的結束。output 對於每組測試樣例,輸出結果為一行字...