diff --git a/number/basis.cc b/number/basis.cc new file mode 100644 index 0000000..7443be2 --- /dev/null +++ b/number/basis.cc @@ -0,0 +1,22 @@ +// in-place modification +int basis(vector& a) { + int n = a.size(); + int has = 0; + for (int i = 63; ~i and has < n; --i) { + for (int j = has; j < n; ++j) { + if (a[j] & (ll(1) << i)) { + swap(a[j], a[has]); + break; + } + } + if (not (a[has] & (ll(1) << i))) continue; + for (int j = 0; j < n; ++j) { + if (j == has) continue; + if (a[j] & (ll(1) << i)) { + a[j] ^= a[has]; + } + } + ++has; + } + return has; +}