Official

M - Max Conference Editorial by Mitsubachi


元の問題と同様に,? からなる区間を A, B, C で挟んだ文字列が複数ある,という設定で考えます.また,同じ文字が隣接する箇所を少なくすると考えます.

文字列が $1$ つの場合を考えます.このとき,各文字についてこの数までなら入れても (少なくともその文字については) 隣接することはないという上限が定まります.また,全ての文字についてこれが満たされていれば実際に隣接することがないように入れることができます.
また,複数の文字についても同様に上限が定まります.これは各文字についての上限を足し合わせた後に,? の個数との min を取ればいいです.
また,これらの条件が満たされていない場合,ある $1$ 種類の文字が余計に入っているという形になります.それによる損失は余計にある分の $2$ 倍ですが,最初だけ $1$ になることがあります.各文字について,最初だけ $1$ になるかを判定しておきます.

文字列が複数ある場合は,それぞれについてのものの合計をとれば良いです.よって,これらより隣接するところがないようにできるかは判定できます.

そうでない場合,いずれかの文字の集合について,個数がオーバーしているという形になります.損失で,最初に $1$ になる回数を最大化したいという形になります.
これは,以下のようにすれば良いです.

  • まず,各文字について多いものを最初に処理する.損失が最初に $1$ となる文字列は,他では最初に $1$ にならないものを優先的に使用する.
  • これらが終わってもまだ上限を超過している場合,ある $2$ つの文字の個数の合計が上限をオーバーしているという形になる.最初に $1$ になるものを優先して使って良い.

これらは \(O(N + Q)\) で動作します.

posted:
last update: