五校聯考1day1 已經沒有什麼好害怕的了

2021-09-30 17:34:56 字數 1134 閱讀 4469

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。

題意:乙個字串,找到合法的串,將合法串的每乙個位置都+1,最後*i(結果不用取模)

解析:首先,我們要對合法的子串有乙個很好的理解()()這是3個合法的子串,設第乙個括號為a,第二個為b,分別是:a,b,ab。也就是說,合法的串相連能構成乙個新的合法串。所以說,要找到所有的串,利用差分的思想來做

#include#include#include#include#include #include using namespace std;

const int n=1e7+10;

char s[n];

long long l[n],r[n],jl[n],num1[n],n,f[n],num2[n];

int main()

for (int j=n+1;j>0;j--)

num1[l[j]]+=num1[j]+1;//從右開始迴圈,找到右括號的下一位,加上右括號的下一位裡的數,相當於加上了所有能與這個合法串組成新的合法串的個數,例如:有a b c 三個合法子串 a的情況:a加上b裡面的數,也加上了能與b構成合法子串的數,能與b構成合法子串,也能與a構成合法子串。

for (int j=1;j<=n;j++) num2[r[j]]+=num2[j]-1;//和上面差不多

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

cout<} }

五校聯考1day1 已經沒有什麼好害怕的了

小y 最近開始學習演算法姿勢,但是因為小r 非常bb,給了她很多b6 題,所以她覺得自己已經沒有什麼前途了。於是小r 給了她一些稍微簡單的題,讓她覺得已經沒有什麼好害怕的了,其中一道是這樣的 給定乙個長度為n 只包含左括號和右括號的序列,現在小r 想要知道經過每乙個位置的合法子串有多少個。空串是乙個...

五校聯考1day1 線段樹什麼的最討厭了

只要呼叫buildtree 1,0,n 就可以得到一顆線段樹了。顯然,一顆線段樹一共有o n 個節點,因為每乙個節點都代表了乙個不同的區間,所以線段樹上一共出現了o n 個不同的區間。現在給了你乙個區間 l,r 他想要你告訴他乙個最小的n 使得區間 l r 出現在了用buildtree 1,0,n ...

五校聯考1day1 我才不是蘿莉控呢

小y 小r 你是蘿莉控嗎。小r 為了避免這個尷尬的話題,小r 決定給小y 做一道題。有乙個長度為n 的正整數陣列a,滿足ai ai 1,現在構造乙個陣列b,令bi 現在,有乙個n n 的網格圖,左下角座標是 1,1 右上角座標是 n,n 有乙個小sb正在座標為 n,1 的位置,每一時刻,如果他現在在...