O(N2)O(N^2) 解は非常に高速ですが、実行時間制限に間に合わせるのは非常に難しいと思われます。より高速な解法を考えます。

まず、 xor演算はbitごとに独立です。よって、0101A,BA,B について、各操作回数 k(0kN1)k(0\leq k \leq N-1) に対する式の値を求めることが出来れば、その答えに適切に係数を掛けたものを足し合わせることにより元の問題を解くことが出来ます。 以下、A,BA,B0101 列であり、0-indexedであるとします。

畳み込みを用いてこの問題を解くことを考えます。
多項式 f(x),g(x)f(x),g(x) をそれぞれ以下のように定義します。

  • f(x)=a0+a1x++a2N1x2N1f(x)=a_0+a_1x+\ldots+a_{2N-1}x^{2N-1}  (Ai mod N=1(A_{i \ mod \ N}=1 ならば ai=1a_i=1Ai mod N=0A_{i \ mod \ N}=0 ならば ai=1)a_i=-1)
  • g(x)=b0+b1x++bN1xN1g(x)=b_0+b_1x+\ldots+b_{N-1}x^{N-1}  (BN1i=1(B_{N-1-i}=1 ならば bi=1b_i=-1BN1i=0B_{N-1-i}=0 ならば bi=1)b_i=1)

f,gf,g の畳み込みの結果を h(x)h(x) とし、 hhxkx^k の係数を CkC_k とすると、N(NC2N1k)/2N-(N-C_{2N-1-k})/2kk 回操作を行ったときの式の値となります。

よって、各bitについてこの計算を行うことにより、 O(NlogNlogAmax)O(N logN logA_{max}) で元の問題を解くことが出来ました。(AmaxA_{max}Ai,BiA_i,B_i の最大値)