枚举 · 例17扩展-翻转游戏:hard
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

\hspace{15pt}本题为困难版本,与简单版本的区别仅在数据的范围上。
\hspace{15pt}nm 列的方格纸上,每一个格子中都有一个灯泡,初始时的亮灭状态已经给定。现在,你可以选中任意位置的灯泡,转换其开关状态(开变为关,关变为开),该操作会同时转换这个位置上下左右四个位置灯泡的开关状态(如果有灯泡的话)。
\hspace{15pt}你可以进行任意数量次的操作,每一次操作可以选择任意位置的灯泡操作,询问是否存在一个操作方案,使得能关闭所有的灯泡。

输入描述:

\hspace{15pt}第一行输入两个整数 n,m \left(1 \leqq n \leqq 10;\ 1 \leqq m \leqq 100 \right) 代表方格纸的大小。
\hspace{15pt}此后 n 行,每行输入一个长度为 m 、仅由 \texttt{\texttt{ 构成的字符串代表灯泡的初始亮灭状态。\texttt{ 代表初始时这个方格中的灯灭;\texttt{ 代表初始时这个方格中的灯亮。

输出描述:

\hspace{15pt}如果存在一种操作方案,使得能够关闭所有的灯泡,在一行上输出 \rm YES ;否则,直接输出 \rm NO
示例1

输入

复制
2 4
0000
0000

输出

复制
YES

说明

\hspace{15pt}在这个样例中,初始时全关,不需要任何操作。
示例2

输入

复制
4 4
0010
0111
1000
1011

输出

复制
YES

说明

\hspace{15pt}在这个样例中,其中一个合法的染色方式为:
\begin{matrix}<br />   0 & 0 & 1 & 0 \\<br />   0 & 1 & 1 & 1 \\<br />   1 & 0 & 0 & 0 \\<br />   1 & 0 & 1 & 1<br />\end{matrix}<br />\to<br />\begin{matrix}<br />   0 & 0 & {\color{orange}{0}} & 0 \\<br />   0 & {\color{orange}{0}} & {\color{orange}{0}} & {\color{orange}{0}} \\<br />   1 & 0 & {\color{orange}{1}} & 0 \\<br />   1 & 0 & 1 & 1<br />\end{matrix}<br />\to<br />\begin{matrix}<br />   0 & 0 & 0 & 0 \\<br />   0 & 0 & 0 & 0 \\<br />   {\color{orange}{0}} & 0 & 1 & 0 \\<br />   {\color{orange}{0}} & {\color{orange}{1}} & 1 & 1<br />\end{matrix}<br />\to<br />\begin{matrix}<br />   0 & 0 & 0 & 0 \\<br />   0 & 0 & 0 & 0 \\<br />   0 & 0 & {\color{orange}{0}} & 0 \\<br />   0 & {\color{orange}{0}} & {\color{orange}{0}} & {\color{orange}{0}}<br />\end{matrix}
示例3

输入

复制
4 4
0010
0111
1000
1010

输出

复制
NO