結果
| 問題 | No.2895 Zero XOR Subset |
| コンテスト | |
| ユーザー |
detteiuu
|
| 提出日時 | 2026-07-25 19:45:57 |
| 言語 | PyPy3 (7.3.17) |
| 結果 |
AC
|
| 実行時間 | 226 ms / 2,000 ms |
| + 311µs | |
| コード長 | 2,522 bytes |
| 記録 | |
| コンパイル時間 | 236 ms |
| コンパイル使用メモリ | 96,116 KB |
| 実行使用メモリ | 113,152 KB |
| 最終ジャッジ日時 | 2026-07-25 19:46:27 |
| 合計ジャッジ時間 | 7,675 ms |
|
ジャッジサーバーID (参考情報) |
judge3_1 / judge2_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 35 |
ソースコード
class XORBasis:
def __init__(self, A):
self.A = A
self.base = []
self.mask = []
self.IDX = []
self.dependent = -1
for i, a in enumerate(self.A):
n = a
xor = 1<<len(self.base)
for j, b in enumerate(self.base):
if n^b < n:
n ^= b
xor ^= self.mask[j]
if n:
self.IDX.append(i)
self.base.append(n)
self.mask.append(xor)
elif self.dependent == -1:
self.dependent = i
if len(self.base) == 0:
return
pairs = sorted(zip(self.base, self.mask), key=lambda x:x[0], reverse=True)
self.base, self.mask = map(list, zip(*pairs))
for i in range(1, len(self.base)):
for j in range(i):
if self.base[j]^self.base[i] < self.base[j]:
self.base[j] ^= self.base[i]
self.mask[j] ^= self.mask[i]
def can_make(self, x):
for b in self.base:
if 1<<(b.bit_length()-1) & x:
x ^= b
return x == 0
def can_make_nonemptyzero(self):
return self.dependent != -1
def get_indices(self, x):
xor = 0
for i, b in enumerate(self.base):
if 1<<(b.bit_length()-1) & x:
x ^= b
xor ^= self.mask[i]
if x:
return None
ans = []
for i in range(len(self.base)):
if 1<<i & xor:
ans.append(self.IDX[i])
return ans
def get_indices_nonemptyzero(self):
if not self.can_make_nonemptyzero():
return None
return sorted(self.get_indices(self.A[self.dependent])+[self.dependent])
def get_max(self, x = 0):
for b in self.base:
x = max(x, x^b)
return x
def get_min(self, x = 0):
for b in self.base:
x = min(x, x^b)
return x
def kth_min(self, k):
if k < 0 or 1<<len(self.base) < k:
return -1
ans = 0
for i, b in enumerate(self.base):
if 1<<(len(self.base)-1-i) & k:
ans ^= b
return ans
def kth_max(self, k):
return self.kth_min((1<<len(self.base))-k)
N = int(input())
A = list(map(int, input().split()))
basis = XORBasis(A)
ans = basis.get_indices_nonemptyzero()
if ans is not None:
print(len(ans))
print(*[a+1 for a in ans])
else:
print(-1)
detteiuu