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 開始忘...