已經沒有什麼好害怕的了

2021-09-10 02:52:57 字數 1368 閱讀 4853

description

小y 最近開始學習演算法姿勢,但是因為小r 非常bb,給了她很多b6 題,所以她覺得自己已經沒有什麼前途了。於是小r 給了她一些稍微簡單的題,讓她覺得已經沒有什麼好害怕的了,其中一道是這樣的:

給定乙個長度為n 只包含左括號和右括號的序列,現在小r 想要知道經過每乙個位置的合法子串有多少個。

空串是乙個合法的串,如果a 和b 都是合法的串,那麼(a) 和ab 都是合法的串。

input

第一行輸入乙個正整數t 表示資料組數。接下來t 行每行乙個字串。

output

對於每組資料,輸出乙個整數表示答案,令ansi 為經過第i 個位置的子串個數,那麼你需要輸出(注意是先求餘再求和)

sample input

1()()

sample output

20樣例解釋:

ans 陣列為,所以輸出20。

data constraint

對於10% 的資料,n<=100

對於30% 的資料,n <= 1000

對於60% 的資料,n <= 5 <= 10^4

對於100% 的資料,n <= 10^6,1 <= t<= 10..

....

分析

棧+差分約束

用棧處理對應的括號

把整個字串拆成幾段(跳過沒用的括號),然後計算即可

對於每一段序列,我們從大到小處理,即從整體到區域性

再用差分約束的思想求出每個點所被經過的合法的括號序列的個數..

...程式:

#include#include#includeusing namespace std;

int n,a[1000010],l[1000010],r[1000010],f[1000010],next[1000010],last[1000010];

char zf[1000010];

long long ans,t[1000010];

void work()

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

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

t[i]=r[i]+l[i];

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

t[i]+=t[i-1];

long long ans=0;

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

ans=(long long)ans+(long long)i*t[i]%1000000007;

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

}int main()

work();

}}

已經沒有什麼好害怕的了

給定乙個長度為n 只包含左括號和右括號的序列,求每乙個位置經過的合法子串有多少個。空串是乙個合法的串,如果a 和b 都是合法的串,那麼 a 和ab 都是合法的串。令a ns i 為第 i 位的答案,對於每組資料,輸出乙個整數an s 1 n an s i imo d p p 1 9 7 n 10 6...

題解 已經沒有什麼好害怕的了

套路滿滿的樣子 o o 實際上在發現 比.多 k 實際上就是要求糖果能量大於藥片能量的組數為 k 時,這題的指向性就很明確了。按照慣例來說,我們應當試圖用 至少 來求出 恰好 的方案數。先考慮容斥的部分 如果可以求出每乙個糖果集合 t 使得 t 中的所有糖果在最後的組合方案中能量都能夠大於所匹配的藥...

bzoj 3622 已經沒有什麼好害怕的了

我好害怕這種題 兩個陣列排序後,處理出next i 表示滿足tang i yao j 的最大的j。f i j 前i種糖果,有j個糖比藥多,不考慮剩餘情況的方案數 也就是剩餘n j個糖果的放法算一種,最後乘上階乘。f i j f i 1 j f i 1 j 1 max next i j 1,0 開始忘...