题解
分块,\(p\)拆成8个一组,因为\(B\)是二进制矩阵,所以8个一组的10进制值只有256种\((2^8)\),预处理以下就行了。\(A\)的大小压缩成了\((n, \frac{p - 1}{8} + 1)\),同理B的大小也压缩成了\((\frac{p - 1}{8} + 1, m)\),因为\(p \le 64\),所以分块后的矩阵乘法复杂度\(O(n * 8 * m)\)。
代码
const int N = 4100;
int n, m, p;
int a[N][70], b[70][N], A[N][10][300], B[10][N];
int main()
{
sc(n), sc(p), sc(m);
rep(i, 0, n) rep(j, 0, p) scanf("%X", &a[i][j]);
rep(i, 0, m) rep(j, 0, p) scanf("%1d", &b[j][i]);
int sze = (p - 1) / 8 + 1;
rep(i, 0, n) rep(j, 0, 256) {
for (int k = 0, cnt = 0; k < p; k += 8, cnt++) {
for (int t = 0; t < 8; ++t) if (j & (1 << t)) A[i][cnt][j] += a[i][k + t];
}
}
rep(i, 0, m) {
for (int k = 0, cnt = 0; k < p; k += 8, cnt++) {
int res = 0;
for (int t = 0; t < 8; ++t) if (b[k + t][i]) res += (1 << t);
B[cnt][i] = res;
}
}
int ans = 0;
rep(i, 0, n) {
rep(j, 0, m) {
int res = 0;
rep(k, 0, sze) res += A[i][k][B[k][j]];
ans ^= res;
}
}
pr(ans);
return 0;
}