记录编号 611366 评测结果 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
题目名称 [THUPC 2025 Final] Now or Never 最终得分 100
用户昵称 GravatarLikableP 是否通过 通过
代码语言 C++ 运行时间 15.180 s
提交时间 2026-01-28 23:13:19 内存使用 5.14 MiB
显示代码纯文本
#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;
}