きろく

特筆すべき記録のまとめ

codeFlyer (bitFlyer Programming Contest):C - 部分文字列と括弧

問題

atcoder.jp

解法

'(' を +1,')' を -1 として累積和 imos を取った時,当てはまる (i, j) の組は

imos[i] == imos[j] - 1

imos[k] >= imos[j] - 1 (i <= k <= j)

を満たしていればよい.1つ目の条件にあてはまる (i, j) の組を std::map などを使って列挙し,それらが2つ目の条件に当てはまるかどうか RMQ のセグ木を使って調べればよい.全ての考えられる組について後者の処理をしていると O(|S|^2) となり間に合わないので,自明に2つ目の条件が当てはまる場合は枝刈りをする.O(|S|).

解答

atcoder.jp

2つ目の条件を考えていなくて 2 WA,枝刈りが出来ていなくて 2 TLE してしまった.自明なケースの枝刈りも重要だと感じた.

f:id:babcs2035:20181220204005p:plain