2020年3月6日金曜日

ARC 045 C - エックスオア多橋君

まずは列に関する同等の問題を解く。つまり、区間の総XORがXXになるような区間の総数を求める問題を考える。頂点を0-basedで与えて0,1,...,N10, 1, ..., N-1とし、区間[0,k)[0, k)の総XORをS[k]S[k]で表すことにする。区間[l,r)[l, r)の総XORはS[r]S[l]S[r] \oplus S[l]と書けて、これがXXに等しいという条件を整理すると

S[l]=S[r]X S[l] = S[r] \oplus X

となる。つまり、r=0r = 0から順に、S[r]XS[r] \oplus Xに等しいようなS[i],i[0,r)S[i], i \in [0, r)が何個あるか数えればよくて、これはハッシュテーブルなどにS[i]S[i]の出現回数を記録していけばO(N){O}(N)でできる。

木に関してもオイラーツアーを考えれば同じようにできるが、列の場合の方針をそのまま適用すると、同じ頂点を重複して数えることになってしまう。対処は簡単で、pre-orderに対応するものだけ数えるとか決めておけばよい。