可以猜到,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 對於每組測試樣例,輸出結果為一行字...