No.2992 Range ABCD String Query
タグ : / 解いたユーザー数 29
作問者 : Iroha_3856 / テスター : lif4635 hiro1729
注意
C++
での想定解コードは約 $\mathrm{650ms}$、PyPy3
での想定解コードは約 $\mathrm{4500ms}$ です。
高速な言語を使用することを強く推奨します。低速な言語の場合は入出力高速化や非本質・非自明な定数倍高速化が求められる可能性が高いです。
問題文
文字列 $X$ が良い文字列であるというのを、以下の条件を満たすことと定義します。
- ある非負整数 $x, y, z, w$ が存在して、$X$ が$x$ 個の
A
、$y$ 個のB
、$z$ 個のC
、$w$ 個のD
をこの順で連結したものと表せる
たとえば、ABCD
、AABCCD
、ABC
、DD
、空文字列などは良い文字列です。($x, y, z, w$ は $0$ でも良いことに注意してください)
すべての文字がA
、B
、C
、D
のいずれかからなる長さ $N$ の文字列 $S$ が与えられます。
正整数 $Q$ が与えられるので、与えられる順に $Q$ 個のクエリを処理してください。
クエリは以下の二種類のいずれかです。
-
1 x c
:- 正整数 $x (1 \leq x \leq N)$ と
A
、B
、C
、D
のいずれかである文字 $c$ が与えられる - $S$ の $x$ 文字目を文字 $c$ で更新する
- 正整数 $x (1 \leq x \leq N)$ と
-
2 L R
:- $1 \leq L \leq R \leq N$ を満たす $L, R$ が与えられるので、$S$ の $L$ 文字目から $R$ 文字目までからなる(連続)部分文字列を $T$ とする
- $T$ に変更操作を任意の回数($0$ 回でも良い)行って良い文字列にするときの変更操作を行う回数の最小値を出力する
- ただし、$T$ に変更操作を行うというのを、$1 \leq i \leq |T|$ を満たす $i$ を一つ選び、$T$ の $i$ 文字目を好きな文字で変更する操作として定義します
入力
$N \ Q$ $S$ $\mathrm{query}_1$ $\mathrm{query}_2$ $\vdots$ $\mathrm{query}_Q$
各 $\mathrm{query}_i$ は、以下のいずれかの形式で与えられる。
$1\ x\ c$
$2\ L\ R$
入力は全て以下の制約を満たす。
- $1 \leq N, Q \leq 2 \times 10 ^ 5$
- $S$ は長さ $N$ の文字列
- $S$ のすべての文字は
A
、B
、C
、D
のいずれか - $1 \leq x \leq N$
- $c$ は
A
、B
、C
、D
のいずれか - $1 \leq L \leq R \leq N$
- $N, Q, x, L, R$ はすべて整数
出力
二つめのクエリについての答えを改行区切りで出力せよ。
サンプル
サンプル1
入力
5 5 ABACD 2 2 5 1 1 D 2 1 5 1 3 D 2 1 5
出力
1 2 2
- $1$ 番目のクエリについて、$T = $
BACD
です。$T$ の $2$ 文字目をB
に変更する $1$ 回の操作を行えば、$T$ はBBCD
と、良い文字列になります。
$0$ 回以下の操作で良い文字列にすることはできないので、答えは $1$ です。 - $2$ 番目のクエリについて、$S$ の $1$ 文字目が
D
に変更され、$S = $DBACD
となります。 - $3$ 番目のクエリについて、$T = $
DBACD
です。$T$ の $1$ 文字目をA
に、$3$ 文字目をB
に変更する $2$ 回の操作を行えば、$T$ はABBCD
と、良い文字列になります。
$1$ 回以下の操作で良い文字列にすることはできないので、答えは $2$ です。 - $4$ 番目のクエリについて、$S$ の $3$ 文字目が
D
に変更され、$S = $DBDCD
となります。 - $5$ 番目のクエリについて、$T = $
DBDCD
です。$T$ の $1$ 文字目をA
に、$3$ 文字目をC
に変更する $2$ 回の操作を行えば、$T$ はABCCD
と、良い文字列になります。
$1$ 回以下の操作で良い文字列にすることはできないので、答えは $2$ です。
サンプル2
入力
15 15 BDBADBADBBBCBDA 2 1 7 1 5 B 1 9 D 1 5 C 2 1 13 1 3 C 2 7 8 2 1 4 1 8 A 2 3 12 2 3 7 1 8 A 1 7 D 2 7 10 2 1 13
出力
4 7 0 2 4 3 2 8
提出するには、Twitter 、GitHub、 Googleもしくは右上の雲マークをクリックしてアカウントを作成してください。