No.3753 Certainly a Cretan
問題文
$1$ から $N$ までの番号が付いた $N$ 人が、番号順に一列に並んでいます。
各人は 「正直者」 または 「嘘つき」 のいずれかの種類に分類されます。
二択の質問をされたとき、正直者は必ず正しく答え、
嘘つきは必ず正しい答えと逆の答えをします。
人 $i$ は、次の質問に Yes または No で答えます。
人 $1,2,\ldots,i$ のうち、自分と同じ種類の人は過半数†を占めていますか?
全員の回答結果を表す長さ $N$ の文字列 $S$ が与えられます。
$S_i=$ Y は人 $i$ の回答が Yes、
$S_i=$ N は No であることを表します。
文字列 $S$ に対して、$Q$ 個のクエリを順に処理してください‡。
クエリには以下の $2$ 種類が存在します。
-
1 i: 人 $i$ の回答 $S_i$ を反転してください。 すなわち、$S_i=$YならNに、 $S_i=$NならYに変更してください。 -
2 K: 現在の $S$ に対して、 嘘つきがちょうど $K$ 人で、全員の回答が $S$ と一致するような各人の種類の割り当ての個数 を $998244353$ で割った余りで出力してください。
† 「過半数」とは、全体の人数が $x$ 人であるときに、
$\left\lfloor \frac{x}{2} \right\rfloor + 1$ 人以上であることを意味します。
‡ 各クエリは独立ではありません。
$1$ 種類目のクエリによる $S$ の変更は、それ以降のクエリにも引き継がれます。
制約
- $1 \leq N \leq 10^6$
- $1 \leq Q \leq 10^5$
- $S$ は
YとNからなる長さ $N$ の文字列 - $1$ 種類目のクエリでは、$1 \leq i \leq N$
- $2$ 種類目のクエリでは、$0 \leq K \leq N$
- $2$ 種類目のクエリが $1$ 個以上含まれる
- $N,Q,i,K$ は整数
入力
入力は以下の形式で標準入力から与えられます。
$N$ $Q$
$S$
$\mathrm{query}_1$
$\mathrm{query}_2$
$\vdots$
$\mathrm{query}_Q$
各クエリは、以下のいずれかの形式で与えられます。
1 $i$
2 $K$
出力
$2$ 種類目のクエリが与えられるたびに、そのクエリに対する答えを $998244353$ で割った余りで一行に出力してください。
サンプル
サンプル1
入力
4 6 NNNN 2 2 1 1 2 2 1 2 2 2 2 3
出力
2 0 1 1
以下では、正直者を H、嘘つきを L と表します。
最初、$S=$ NNNN です。
嘘つきがちょうど $2$ 人で条件を満たす割り当ては、
LLHH, LHLH の $2$ 通りです。
次に、人 $1$ の回答を反転すると、
$S=$ YNNN となります。
このとき、嘘つきがちょうど $2$ 人で条件を満たす割り当ては存在しません。
さらに、人 $2$ の回答を反転すると、
$S=$ YYNN となります。
このとき、条件を満たす割り当ては
HLLH, HLLL の $2$ 通りです。
それぞれの嘘つきの人数は $2$ 人、$3$ 人であるため、
最後の $2$ つのクエリに対する答えはいずれも $1$ となります。
サンプル2
入力
53 17 YYYYYYYYYYYYYYNNNNNNNNNNNNNNYYYYYYYYYYYYYYYYNNNNNNNNN 2 27 2 30 1 53 2 26 1 53 2 28 1 11 2 0 1 12 2 27 2 28 1 11 2 53 1 12 2 29 2 30 2 31
出力
72814577 108940334 689767761 653642004 0 83916727 238511167 0 118112539 108940334 263178630
クエリ 1 では、同じ $i$ が複数回選ばれることがあります。 また、答えは非常に大きくなる可能性があるため、$998244353$ で割った余りを出力してください。
提出するには、Twitter 、GitHub、 Googleもしくは右上の雲マークをクリックしてアカウントを作成してください。
siganai