static mat I(){ mat R; for (int i = 1; i <= n; i++) { R[i][i] = 1; } return R; }
mat T()const{ mat R; for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { R[i][j] = _m[j][i]; } } return R; }
friend mat operator*(const mat &A, const mat &B) { mat T = B.T(), R; for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { R[i][j] = (A[i] & T[j]).count() & 1; } } return R; } } A;
intgauss(mat &A, mat &R){ R = mat::I(); int r = 0; for (int i = 1, p = 1; i <= n; i++) { if (!A[p][i]) { for (int j = p + 1; j <= n; j++) { if (A[j][i]) { std::swap(A[p], A[j]); std::swap(R[p], R[j]); break; } } } if (!A[p][i]) continue; for (int j = 1; j <= n; j++) { if (j != p && A[j][i]) { A[j] ^= A[p], R[j] ^= R[p]; } } p += 1, r += 1; } return r; }
mat adj, adjt; voidgetadj(mat A){ mat P, Q; int r = gauss(A, P); A = A.T(), gauss(A, Q), Q = Q.T();
if (r < n - 1) return; elseif (r == n - 1) adj[n][n] = 1; else adj = mat::I();
adj = Q * adj * P; adjt = adj.T(); }
int m, k, q; vec chi[N + 5], chj[N + 5];
char buf[N + 5]; intmain(){ scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%s", buf + 1); for (int j = 1; j <= n; j++) { A[i][j] = buf[j] - '0'; } } scanf("%d%d", &m, &k); for (int i = 1; i <= m; i++) { scanf("%s", buf + 1); for (int j = 1; j <= n; j++) { chi[i][j] = buf[j] - '0'; } } for (int i = 1; i <= k; i++) { scanf("%s", buf + 1); for (int j = 1; j <= n; j++) { chj[i][j] = buf[j] - '0'; } }