1. 程式人生 > >CF1095E Almost Regular Bracket Sequence

CF1095E Almost Regular Bracket Sequence

字符 匹配 sequence racket 小括號 字符串 true 前綴和 發現

CF1095E Almost Regular Bracket Sequence

給定一個長度為 \(n\) 的小括號序列,求有多少個位置滿足將這個位置的括號方向反過來後使得新序列是一個合法的括號序列。

這道題要用到高級前綴和+後綴和。

我們設兩個int數組\(s1\)\(s2\),兩個bool數組\(b1\)\(b2\)

\(s1\)數組這麽處理:順序遍歷字符串,遇到左括號\(+1\),遇到右括號\(-1\)

\(s2\)數組這麽處理:逆序遍歷字符串,遇到右括號\(+1\),遇到左括號\(-1\)

\(b1\)數組這麽處理:\(s1\)數組相應值\(\geq 0\)的下標為true。

\(b2\)數組這麽處理:\(s2\)數組相應值\(\geq 0\)的下標為true。

顯然,\(b1\)\(b2\)數組為true的地方,前面才不會產生別的不匹配,才能考慮與答案計算。

最後,遍歷字符串,設找到第\(i\)個時,當前後都合法時,分兩種情況考慮:

  1. 當前字符是左括號。改為右括號後,發現需要滿足前面的\(s1\)\(1\)再減後面的\(s2\)為0,這個點就滿足。
  2. 當前字符是右括號。改為左括號後,發現需要滿足前面的\(s1\)加1再減後面的\(s2\)為0,這個點就滿足。

最後輸出就完事了。

CF1095E Almost Regular Bracket Sequence