File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff 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;
You can’t perform that action at this time.
0 commit comments