解説

それぞれの kk について、 CkSkC_k S_k を高速に求める方法を考えます。

まず、 SkS_k は累積和によって前処理 O(N)O(N) 、クエリ O(1)O(1) で求まります。

次に、 CkC_k について考えると、これは Z-algorithm を工夫して使うことで求まります。 数列 XX に対して、 XX を逆順に並べたものを XRX^R と表記することにします。

数列 TT を、 ARA^R1-1BRB^R の順で並べたものと定義します。 例えば、 A=(1,2,3),B=(4,5,6)A = (1, 2, 3), B = (4, 5, 6) のとき、 C=(3,2,1,1,6,5,4)C = (3, 2, 1, -1, 6, 5, 4) となります。

数列 ZZ を、 Zi=Z_i = 数列 CC の前から ii 文字目までの接尾辞と CC の最長共通接頭辞の長さと定義します。 数列 ZZ は Z-algorithm を使って O(N+M)O(N + M) で求めることができます。 このとき、 CkC_k は数列 ZZN+1N+1 番目以降にある kk 以上の値の数です。