halcの競プロ精進ブログ

はるくが競プロしたことを書き留めるなにか

【今日の精進】ABC283G - Partial Xor Enumeration

毎日格上の問題を倒すやつの89日目です。

問題リンク

atcoder.jp

問題概要

数列 A のいくつかの要素をxorしてできる数のうち、小さい方から L 番目から R 番目までのものを列挙してね。

解法

xorの基底の練習問題です。

noshiさんが広めたよくわからないすごい方法で基底を求めます。

すると、あとは上の位から決定すればよいです。

提出コード

N,L,R=map(int,input().split())
base=[]
for i in list(map(int,input().split())):
    for j in base:
        i=min(i,i^j)
    if i:
        base.append(i)
base.sort()
ans=[]
for i in range(L-1,R):
    ans.append(0)
    for j in range(len(base)-1,-1,-1):
        if (i>>j)&1:
            ans[-1]=max(ans[-1],ans[-1]^base[j])
        else:
            ans[-1]=min(ans[-1],ans[-1]^base[j])
print(*ans)

Submission #48629696 - UNIQUE VISION Programming Contest 2022 Winter(AtCoder Beginner Contest 283)

感想

あまりにもうまくいっててびっくりした

空いた日にやってたこと

87日目

88日目