样例输入 1
3
2 3 1 1
000
000
011
110
2 3 1 1
000
000
111
111
2 3 2 1
000
000
111
111
样例输出 1
Yes
Yes
No
样例解释 1
对于第11个样例,你可以先选择(1,2)(1,2)和(1,3)(1,3),然后再选择(2,1)(2,1)和(2,2)(2,2)。
对于第22个样例,你可以先选择(1,1)(1,1)和(1,2)(1,2),然后选择(2,1)(2,1)和(2,2)(2,2),最后选择(1,3)(1,3)和(2,3)(2,3)。
对于第33个样例,你不管怎么操作都无法从AA变成BB。
#include<bits/stdc++.h>
using namespace std;
bool ok(bool d[], int h, int w) {
return accumulate(d, d + h * w, 0) % 2 == 0;
}
bool ok() {
int h, w, r, c;
scanf("%d%d%d%d", &h, &w, &r, &c);
static char b[1<<20];
static bool d[1<<20];
for (int i = 0, k = 0; i <h; ++i) {
scanf(" %s", b);
for (int j = 0; j < w; ++j, ++k) d[k] = (b[j] & 1);
}
for (int i = 0, k = 0; i <h; ++i) {
scanf(" %s", b);
for (int j = 0; j < w; ++j, ++k) d[k] ^= (b[j] & 1);
}
for (int sr = 0; sr < r; ++sr)
for (int sc = 0; sc < c; ++sc) {
bool* x = reinterpret_cast<bool*>(b);
const int h2 = (h + r - 1 - sr) / r, w2 = (w + c - 1 - sc) / c;
for (int i = sr, u = 0 ; i < h; ++u, i += r)
for (int j = sc, v = 0;j < w; ++v, j += c)
x[u * w2 + v] = d[i * w + j];
if (!ok(x, h2, w2))
return false;
}
return true;
}
int main() {
int T;
scanf("%d", &T);
for (int i = 0; i < T; ++i) puts(ok() ? "Yes":"No");
}