(Unkind) Sandwich Degree

2 secs 1024 MB
Nachia's icon Nachia

不親切ポイント

(プラットフォーム別のフォーマットを優先したうえで)よいこはマネしないで

  • 明らかに無駄な描写
  • 3×1063\times 10^6
  • サンプルが弱い
  • 入力欄が Codeforces (Codeforces が悪いのではなく、コンテスト内で揃えないのがよくない)
  • 十分な効果がない「引用」を用いた問題文 markdown

想定解法

  • 文字列 XXaa 番目から bb 番目の文字を取り出した部分文字列を X[a,b]X_{[a,b]} で表します。 a>ba \gt b のとき、 X[a,b]X_{[a,b]} は空文字列とします。
  • 計算量の表示では、文字の種類数を CC とします。

文字種ごとに分解して考えます。 A に注目するとします。

突然ですが、文字列 XX について以下の値を求めておいたとします。 (1)\cdots \cdots (1)

  • Cnt(X)\mathrm{C_{nt}}(X) : A の数
  • Sidx(X)\mathrm{S_{idx}}(X) : A のインデックス(0-based)の総和
  • Slen(X)\mathrm{S_{len}}(X) : 嬉しさ 、ただし X[i]=X[j]=X[i]=X[j]= A の場合のみ考える。

すると、 X,X+YX,X+Y の場合の (1)(1) の結果から Slen(Y)\mathrm{S_{len}}(Y) が計算できます。

  • Cnt(Y)=Cnt(X+Y)Cnt(X)\mathrm{C_{nt}}(Y) = \mathrm{C_{nt}}(X+Y) - \mathrm{C_{nt}}(X)
  • Sidx(Y)=Sidx(X+Y)Sidx(X)\mathrm{S_{idx}}(Y) = \mathrm{S_{idx}}(X+Y) - \mathrm{S_{idx}}(X)
  • Slen(Y)=Slen(X+Y)Slen(X)Cnt(Y)×Sidx(X)+Cnt(X)×(Sidx(Y)+Cnt(Y))\mathrm{S_{len}}(Y) = \mathrm{S_{len}}(X+Y) - \mathrm{S_{len}}(X) - \mathrm{C_{nt}}(Y) \times \mathrm{S_{idx}}(X) + \mathrm{C_{nt}}(X) \times (\mathrm{S_{idx}}(Y) + \mathrm{C_{nt}}(Y))

したがって、クエリ (l,r)(l,r) に関して、 S[1,l1]S_{[1,l-1]}S[1,r]S_{[1,r]} について (1)(1) の結果がわかっていれば、このクエリに O(1)O(1) 時間で答えられます。

SS の長さに対してクエリ数が小さいので、座標圧縮をします。その結果をもとに S[1,l1],S[1,r]S_{[1,l-1]},S_{[1,r]} を列挙することは、累積和のようにして O(N+QC+QlogQ)O(N+QC+Q \log Q) 時間で可能です。

全体の計算量は O(N+QC+QlogQ)O(N+QC+Q \log Q) です。空間計算量は O(N+QC)O(N+QC) です。

クエリの答えとしてありうる値は最大で 45000090000025000004.5×10184500009000002500000 \fallingdotseq 4.5 \times 10^{18} です。オーバーフローに注意してください。