This documentation is automatically generated by online-judge-tools/verification-helper
#include "Math/F2vector.hpp"
#pragma once
vector<int> Intersection(vector<int> &X, vector<int> &Y) {
vector<int> Xb, Yb;
for (auto x : X) {
for (auto &b : Xb)
chmin(x, x ^ b);
if (x)
Xb.push_back(x);
}
for (auto y : Y) {
for (auto &b : Yb)
chmin(y, y ^ b);
if (y)
Yb.push_back(y);
}
vector<ll> A(SZ(Xb) + SZ(Yb));
rep(i, 0, SZ(Xb)) A[i] = ll(Xb[i]) << 30 | Xb[i];
rep(i, 0, SZ(Yb)) A[SZ(Xb) + i] = ll(Yb[i]);
int rank = 0;
rep(k, 0, 30) {
if (rank == SZ(A))
break;
rep(i, rank, SZ(A)) {
if (A[i] >> k & 1) {
swap(A[rank], A[i]);
break;
}
}
if (!(A[rank] >> k & 1))
continue;
rep(j, 0, SZ(A)) if (j != rank) {
if (A[j] >> k & 1)
A[j] ^= A[rank];
}
rank++;
}
vector<int> ret;
rep(i, rank, SZ(A)) {
int add = A[i] >> 30;
if (add)
ret.push_back(add);
}
return ret;
}
template <typename T> vector<T> inverse(vector<T> &a) {
int n = SZ(a);
vector<T> b(n);
rep(i, 0, n) b[i][i] = 1;
rep(i, 0, n) {
rep(k, i + 1, n) if (a[k][i]) {
swap(a[k], a[i]);
swap(b[k], b[i]);
}
if (!a[i][i]) {
print(-1);
return 0;
}
rep(k, 0, n) if (k != i and a[k][i]) {
a[k] ^= a[i];
b[k] ^= b[i];
}
}
return b;
}
/**
* @brief $\mathbb{F}_2$ vector
*/
#line 2 "Math/F2vector.hpp"
vector<int> Intersection(vector<int> &X, vector<int> &Y) {
vector<int> Xb, Yb;
for (auto x : X) {
for (auto &b : Xb)
chmin(x, x ^ b);
if (x)
Xb.push_back(x);
}
for (auto y : Y) {
for (auto &b : Yb)
chmin(y, y ^ b);
if (y)
Yb.push_back(y);
}
vector<ll> A(SZ(Xb) + SZ(Yb));
rep(i, 0, SZ(Xb)) A[i] = ll(Xb[i]) << 30 | Xb[i];
rep(i, 0, SZ(Yb)) A[SZ(Xb) + i] = ll(Yb[i]);
int rank = 0;
rep(k, 0, 30) {
if (rank == SZ(A))
break;
rep(i, rank, SZ(A)) {
if (A[i] >> k & 1) {
swap(A[rank], A[i]);
break;
}
}
if (!(A[rank] >> k & 1))
continue;
rep(j, 0, SZ(A)) if (j != rank) {
if (A[j] >> k & 1)
A[j] ^= A[rank];
}
rank++;
}
vector<int> ret;
rep(i, rank, SZ(A)) {
int add = A[i] >> 30;
if (add)
ret.push_back(add);
}
return ret;
}
template <typename T> vector<T> inverse(vector<T> &a) {
int n = SZ(a);
vector<T> b(n);
rep(i, 0, n) b[i][i] = 1;
rep(i, 0, n) {
rep(k, i + 1, n) if (a[k][i]) {
swap(a[k], a[i]);
swap(b[k], b[i]);
}
if (!a[i][i]) {
print(-1);
return 0;
}
rep(k, 0, n) if (k != i and a[k][i]) {
a[k] ^= a[i];
b[k] ^= b[i];
}
}
return b;
}
/**
* @brief $\mathbb{F}_2$ vector
*/