#P16414. 二维取反机

二维取反机

二维取反机

题目背景

工程师正在调试一台能够对二进制矩阵进行整片取反的机器。机器只能从矩阵的四个方向选择一段完整的行或列进行操作。现在需要从一张较大的矩阵中截取一块连续区域,使这块区域能够被机器完全清零。

题目描述

一个二进制矩阵的每个元素都是 01

对于一个具有 NN 行、MM 列的二进制矩阵,二维取反机支持以下四类操作。矩阵的行编号为 0,1,,N10,1,\ldots,N-1,列编号为 0,1,,M10,1,\ldots,M-1

  • N i:将第 00 行至第 ii 行中的所有元素取反;
  • S i:将第 ii 行至第 N1N-1 行中的所有元素取反;
  • W j:将第 00 列至第 jj 列中的所有元素取反;
  • E j:将第 jj 列至第 M1M-1 列中的所有元素取反。

其中,取反表示将 0 变为 1,将 1 变为 0

如果经过有限次操作后,可以使矩阵中的所有元素均变为 0,则称这个矩阵是可擦除的

原矩阵的一个连续子矩阵由若干连续的行和若干连续的列交叉形成,且至少包含一行和一列。选择全部行或全部列也是允许的。

给定一个二进制矩阵,请求出其中面积最大的可擦除连续子矩阵,并输出其包含的元素数量。

对于选出的连续子矩阵,应将它视为一张独立矩阵,并在这张子矩阵上执行上述操作。

输入格式

第一行包含两个整数 N,MN,M,分别表示矩阵的行数和列数。

接下来 NN 行,每行包含一个长度为 MM 的二进制字符串,描述矩阵的一行。

输出格式

输出一个整数,表示面积最大的可擦除连续子矩阵所包含的元素数量。

样例

样例输入 #1

4 4
0011
0011
1100
0111

样例输出 #1

12

样例输入 #2

4 4
0011
1011
0101
1010

样例输出 #2

9

样例输入 #3

4 4
1011
0011
0101
1010

样例输出 #3

8

样例输入 #4

3 13
0000110101010
0111101010111
1110110111011

样例输出 #4

13

样例输入 #5

20 20
11000000000110101101
00111111011101101101
00110011110111100010
10011110111110000111
00111010000000110111
00001101011011010110
11010010100100101100
11101101011011000001
11000010100100111001
11011010100100101010
10110010100100110110
01100010100100111001
10110010100100110011
01110101011011001010
01111101011011001011
00001000010010101011
11100101100100110001
10100100111001010101
11111000001010011110
01110100001110011111

样例输出 #5

100

样例输入 #6

6 4
0111
1101
1001
0001
1101
1111

样例输出 #6

8

样例输入 #7

1 1
0

样例输出 #7

1

样例说明

在样例 1 中,整个 4×44\times 4 矩阵无法被完全擦除,但由最上方三行和全部四列组成的 3×43\times 4 连续子矩阵可以被擦除。

一种操作过程如下:

0011         1100         0000
0011  -N 1-> 1100  -W 1-> 0000
1100         1100         0000

因此最大面积为 3×4=123\times4=12

在样例 5 中,第 55 行至第 1414 行、第 55 列至第 1414 列组成的 10×1010\times10 连续子矩阵可擦除,因此答案为 100100。这里的行列编号从 00 开始。

数据范围

  • 1N,M401\le N,M\le40
  • 输入矩阵中的字符仅可能为 01