#D0966. 行列异或

行列异或

题目描述

33DAI 想构造一个 nn 行 mm 列的 0101 矩阵(每个格子填 00 或 11)。他手里有两条给定的信息:

  • 第 ii 行所有数的异或和是 rir_i;
  • 第 jj 列所有数的异或和是 cjc_j。

请你构造出一个满足这两条信息的矩阵;如果不存在这样的矩阵,输出 No。

⊕\oplus 表示按位异或:把两个数写成二进制后逐位比较,相同得 00、不同得 11。 判断"一行(或一列)的异或和是否等于 xx",就是把这一行(列)里的数依次异或起来,看结果是否等于 xx。 C++ 中按位异或写作 ^,例如 a ^ b。

本题的答案不唯一,只要给出任意一个满足要求的矩阵都算正确。

输入格式

输入的第一行是一个整数 tt,表示测试用例组数。

接下来依次给出 tt 组测试用例,每组测试用例的格式为:

  • 第一行两个整数 n,mn, m;
  • 第二行 nn 个整数 r1,r2,…,rnr_1, r_2, \dots, r_n(每个都是 00 或 11);
  • 第三行 mm 个整数 c1,c2,…,cmc_1, c_2, \dots, c_m(每个都是 00 或 11)。

输出格式

对每组测试用例:

  • 若存在满足要求的矩阵,输出 Yes,随后 nn 行,每行一个长度为 mm 的字符串,只由 0 和 1 组成,表示矩阵的一行;
  • 若不存在,输出一行 No。
3
2 3
0 0
1 0 1
2 2
1 0
1 0
1 2
0
1 1
Yes
000
101
Yes
01
11
Yes
11

样例 1 解释

第 1 组:n=2n = 2、m=3m = 3,要求第 1,21, 2 行的异或和都是 00,三列的异或和分别是 1,0,11, 0, 1。样例输出

000
101

第 11 行 0⊕0⊕0=00 \oplus 0 \oplus 0 = 0、第 22 行 1⊕0⊕1=01 \oplus 0 \oplus 1 = 0,两行都满足;三列分别是 0⊕1=10 \oplus 1 = 1、0⊕0=00 \oplus 0 = 0、0⊕1=10 \oplus 1 = 1,也都满足。

第 2 组:n=m=2n = m = 2,要求两行的异或和分别是 1,01, 0,两列的异或和分别是 1,01, 0。样例输出

01
11

第 11 行 0⊕1=10 \oplus 1 = 1、第 22 行 1⊕1=01 \oplus 1 = 0;第 11 列 0⊕1=10 \oplus 1 = 1、第 22 列 1⊕1=01 \oplus 1 = 0,行列都满足要求。

第 3 组:n=1n = 1、m=2m = 2,要求这一行的异或和是 00,两列的异或和分别是 1,11, 1。样例输出 11:这一行 1⊕1=01 \oplus 1 = 0,两列各自只有一个数,分别是 11 和 11,都满足要求。

样例 2

见 parity2.in 与 parity2.ans。

样例 3

见 parity3.in 与 parity3.ans。

数据范围

对于所有测试数据,保证:

  • 1≤t≤1001 \le t \le 100;
  • 1≤n,m≤10001 \le n, m \le 1000;
  • ri,cj∈{0,1}r_i, c_j \in \{0, 1\};
  • 所有测试用例的 n×mn \times m 之和不超过 10610^6。

子任务

本题共 20 个测试点,按测试点计分:

测试点 分值 每个测试点 特殊限制
1∼61 \sim 6 3030 55 n,m≤3n, m \le 3
7∼127 \sim 12 n,m≤100n, m \le 100
13∼2013 \sim 20 4040 无额外限制

每个测试点单独评分,全部测试点的得分之和即为本题得分。