いむらや競プロ雑記

キーワード:競プロ、育児、石川県

ABC197 C - ORXOR

atcoder.jp

誤読抜きにしても、BIT全探索の理解が甘く、まるで解けなかった・・・
だいぶ時間かかって、やっと分かり易いコードに落ちた気がするので、メモ。
なお、PyPyじゃないと通らない(500msくらい)

def resolve():
  N=int(input())
  A=list(map(int,input().split()))

  Min=10**100
  n=N

  #値0,1,2,3に対して0,1,2の区切りを入れる全パターン列挙
  #区間内が空は許されないので、区切りは0の後、1の後...と捉える
  pattern=[]
  for i in range(2 ** (n-1)):
    tmp = [False] * (n-1)
    for j in range(n-1):
      if i >> j & 1:
          tmp[j] = True
    pattern.append(tmp)

  #各パターンに対し計算する
  for ptn in pattern:
    ORs=[]#区切り内でORした値集
    XOR=0
    ORtemp=A[0]
    for i in range(n-1):
      if ptn[i]:
        ORs.append(ORtemp)
        ORtemp=A[i+1]
      else:
        ORtemp|=A[i+1]
    ORs.append(ORtemp)

    #区切ったOR集が完成するので、それぞれXOR
    for ors in ORs:
      XOR^=ors
    Min=min(Min,XOR)
        
  print(Min)