Skip to content

Commit 569315f

Browse files
committed
fixed some bugs in XORBasis.rank()
1 parent 2812831 commit 569315f

1 file changed

Lines changed: 10 additions & 9 deletions

File tree

src/alfred/math/linear.hpp

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -162,22 +162,23 @@ struct XORBasis {
162162
return ans;
163163
}
164164
inline int size(void) { return siz; }
165-
inline void rebuild(void) {
165+
std::vector<T> rebuild(void) {
166166
for (int i = C - 1; i >= 0; i--) {
167167
for (int j = 0; j < i; j++) {
168168
if (p[i] >> j & 1) p[i] ^= p[j];
169169
}
170170
}
171-
}
172-
inline T kth(size_t k) { // kth minimum
173-
rebuild();
174171
std::vector<T> narr;
175172
for (int i = 0; i < C; i++) {
176173
if (p[i] != 0) narr.push_back(p[i]);
177174
}
175+
assert(narr.size() == (size_t)siz);
176+
return narr;
177+
}
178+
inline T kth(size_t k) { // kth minimum
178179
T ans = 0;
179180
assert(k >= 1);
180-
assert(narr.size() == (size_t)siz);
181+
auto narr = rebuild();
181182
if (k > 1 || !has_zero) {
182183
k -= has_zero;
183184
assert(k < (1ull << siz));
@@ -188,11 +189,11 @@ struct XORBasis {
188189
return ans;
189190
}
190191
inline size_t rank(T x) {
191-
rebuild();
192192
size_t ans = 0;
193-
for (int i = C - 1; i >= 0; i--) {
194-
if (x >= p[i]) {
195-
ans |= 1ull << i, x ^= p[i];
193+
auto narr = rebuild();
194+
for (int i = siz - 1; i >= 0; i--) {
195+
if (x >= narr[i]) {
196+
ans |= 1ull << i, x ^= narr[i];
196197
}
197198
}
198199
return ans + has_zero;

0 commit comments

Comments
 (0)