显示代码纯文本
#include <cstdio>
#include <bitset>
#include <iostream>
using namespace std;
#define MAXN 2007
#define MAXM 2007
#define MAXQ 2007
bitset<MAXM> s[MAXN], base[MAXN], proj[MAXN], t, frow, tmp, dcmp, coef;
char buf[MAXM];
int main() {
freopen("thupc_2025_leximin.in", "r", stdin);
freopen("thupc_2025_leximin.out", "w", stdout);
int n, m, q, i, j, k, ptr;
scanf("%d %d %d", &n, &m, &q);
for (i = 0; i < n; ++i) {
scanf("%s", buf);
for (j = 0; j < m; ++j) s[i][j] = buf[j] - '0';
}
for (ptr = i = 0; i < m; ++i) {
if (ptr == n) break;
if (s[ptr][i]) base[i] = s[ptr];
else {
for (j = ptr + 1; j < n; ++j) if (s[j][i]) break;
if (j == n) {
frow[i] = 1;
base[i][i] = 1;
continue;
}
base[i] = s[j];
s[j] = s[ptr];
}
for (j = ptr + 1; j < n; ++j) if (s[j][i]) s[j] ^= base[i];
++ptr;
}
if (i < m) {
for (; i < m; ++i) {
frow[i] = 1;
base[i][i] = 1;
}
}
for (i = 0; i < m; ++i) {
tmp = base[i];
for (j = i + 1; j < m; ++j) {
if (tmp[j]) {
tmp ^= base[j];
proj[i][j] = 1;
}
}
}
for (k = 0; k < q; ++k) {
scanf("%s", buf);
for (j = 0; j < m; ++j) t[j] = buf[j] - '0';
tmp = t;
dcmp.reset();
for (i = 0; i < m; ++i) {
if (tmp[i]) {
dcmp[i] = 1;
tmp ^= base[i];
}
}
coef = dcmp;
for (i = 0; i < m - 1; ++i) {
if ((frow & dcmp).none()) {
coef ^= ((dcmp >> i) << i);
break;
}
if (frow[i]) {
dcmp[i] = 0;
}
else {
if (!t[i]) {
t ^= base[i];
coef[i].flip();
}
dcmp ^= proj[i];
}
}
if (i == m - 1) {
if (t[i] && !frow[i]) coef[i].flip();
}
t.reset();
for (i = 0; i < m; ++i) if (coef[i]) t ^= base[i];
for (j = 0; j < m; ++j) buf[j] = t[j] + '0';
printf("%s\n", buf);
}
return 0;
}