atcoder#ABC291G. [ABC291G] OR Sum

[ABC291G] OR Sum

配点 : 600600

問題文

長さ NN の数列 A=(A0,A1,,AN1)A=(A_0,A_1,\ldots,A_{N-1})B=(B0,B1,,BN1)B=(B_0,B_1,\ldots,B_{N-1}) が与えられます。 また、高橋君は数列 AA に対して、次の操作を好きな回数 ( 00 回でもよい) 行う事ができます。

  • AA11 つ左にシフトする、すなわち、AA を、Ai=A(i+1)%NA'_i=A_{(i+1)\% N} で定義される AA' で置き換える。ただし、x%Nx\% N で、xxNN で割った余りを表す。

高橋君の目的は i=0N1(AiBi)\displaystyle\sum_{i=0}^{N-1} (A_i|B_i) を最大化することです。ただし、xyx|yxxyy のビット毎の論理和(bitwise OR)を表します。

i=0N1(AiBi)\displaystyle\sum_{i=0}^{N-1} (A_i|B_i) の値としてあり得る最大の値を求めてください。

ビット毎の論理和(bitwise OR)とは 1 ビットの数字 (0 または 1) の組に対して下の表で定義される演算を論理和(またはOR演算)といいます。
ビット毎に論理和を適用する演算をビット毎の論理和(bitwise OR)といいます。
x y x|y
0 0 0
0 1 1
1 0 1
1 1 1

論理和ではビット x, y の少なくとも一方が 1 の場合に結果が 1 となります。 逆に言うと、共に 0 の場合のみ結果が 0 となります。

具体例
0110 | 0101 = 0111

制約

  • 2N5×1052 \leq N \leq 5\times 10^5
  • 0Ai,Bi310\leq A_i,B_i \leq 31
  • 入力はすべて整数

入力

入力は以下の形式で標準入力から与えられる。

NN

A0A_0 A1A_1 \ldots AN1A_{N-1}

B0B_0 B1B_1 \ldots BN1B_{N-1}

出力

i=0N1(AiBi)\displaystyle\sum_{i=0}^{N-1} (A_i|B_i) の値としてあり得る最大の値を出力せよ。

3
0 1 3
0 2 3
8

高橋君が一度も操作を行わなかった時、AA(0,1,3)(0,1,3) のままであり、$\displaystyle\sum_{i=0}^{N-1} (A_i|B_i)=(0|0)+(1|2)+(3|3)=0+3+3=6$, 高橋君が 11 回操作を行った時、A=(1,3,0)A=(1,3,0) となり、$\displaystyle\sum_{i=0}^{N-1} (A_i|B_i)=(1|0)+(3|2)+(0|3)=1+3+3=7$, 高橋君が 22 回操作を行った時、A=(3,0,1)A=(3,0,1) となり、$\displaystyle\sum_{i=0}^{N-1} (A_i|B_i)=(3|0)+(0|2)+(1|3)=3+2+3=8$ となります。33 回以上操作を行った時、 AA は上記のいずれかの形になるため、i=0N1(AiBi)\displaystyle\sum_{i=0}^{N-1} (A_i|B_i) の最大値は 88 であり、88 を出力します。

5
1 6 1 4 3
0 6 4 0 1
23

最大となるのは高橋君が 33 回操作を行った時であり、この時 A=(4,3,1,6,1)A=(4,3,1,6,1) となり、 $\displaystyle\sum_{i=0}^{N-1} (A_i|B_i)=(4|0)+(3|6)+(1|4)+(6|0)+(1|1)=4+7+5+6+1=23$ となります。