小苯的矩阵反转
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

\hspace{15pt}小苯有一个 nm 列的 01 矩阵,其中有些格子是 1,另一些为 0。小苯希望从其中选择恰好:两行(可以相同),或两列(可以相同),或一行和一列。将选择的行和列中的数字先后 "反转"。(即 0110。)
\hspace{15pt}需要注意的是:如果同时选择了行和列,则交叉点处的点会 "反转" 两次,相当于没有 "反转"。)

\hspace{15pt}现在他想知道,他是否可以把矩阵变成全 0 的,请你帮他确定一下吧。

输入描述:

\hspace{15pt}每个测试文件均包含多组测试数据。第一行输入一个整数 T\ (1\leqq T\leqq 100) 代表数据组数,每组测试数据描述如下:

\hspace{15pt}第一行两个整数 n, m\ (1 \leqq n, m \leqq 1000),表示矩阵的行数和列数。
\hspace{15pt}接下来 n 行,每行一个长度为 m01 串,描述题中所述的矩阵。

\hspace{15pt}除此之外,保证单个测试文件的 n\times m 的总和不超过 10^7
\hspace{15pt}本题数据量较大,我们建议您选取较快的读入方式。

输出描述:

对于每组测试数据:
\hspace{15pt}在单独的一行输出一个字符串,如果可以做到则输出 "YES",否则输出 "NO"。(都不含双引号。)
示例1

输入

复制
4
4 4
0000
1111
0000
1111
3 3
010
101
010
2 2
11
11
3 2
00
10
10

输出

复制
YES
YES
YES
NO

说明

对于第一组测试数据,可以选择 "反转" 第二行和第四行。
对于第二组测试数据,可以选择 "反转"第二行和第二列。