Pavementland 是一个矩形城市,可以建模为一个 $h \times w$ 的网格。网格的行从北到南编号为 $1$ 到 $h$,列从西到东编号为 $1$ 到 $w$。我们将位于第 $r$ 行第 $c$ 列的单元格称为单元格 $(r, c)$。
在网格中,每个单元格要么是空的,要么包含一座建筑物。至少有一个单元格是空的。
由于季风涌动,Pavementland 全境正在发生山洪。最初,一个空单元格被雨水淹没。然后,水根据以下规则流动:
- 如果一个空单元格与至少一个被淹没的单元格相邻,它就会被淹没。
- 如果一个包含建筑物的单元格与至少两个被淹没的单元格相邻,建筑物就会倒塌,该单元格也会被淹没。
注意,如果两个单元格共享一条边,则称它们相邻。一个单元格最多与四个其他单元格相邻。设 $f((r, c))$ 为如果单元格 $(r, c)$ 最初被淹没,则在该过程结束后会被淹没的单元格数量。
城市官员希望预测所有可能情况下的山洪范围。请帮助他们确定所有空单元格 $(r, c)$ 的 $f((r, c))$ 之和。
输入格式
你的程序必须从标准输入读取数据。
第一行包含两个空格分隔的整数 $h$ 和 $w$。
接下来的 $h$ 行输入,每行包含一个长度为 $w$ 的二进制字符串。如果第 $r$ 行的第 $c$ 个字符是 $0$,则单元格 $(r, c)$ 是空的。如果第 $r$ 行的第 $c$ 个字符是 $1$,则单元格 $(r, c)$ 包含一座建筑物。
输出格式
你的程序必须输出到标准输出。
输出一个整数,即所有空单元格 $(r, c)$ 的 $f((r, c))$ 之和。
子任务
对于所有测试用例,输入将满足以下范围:
- $1 \le h, w \le 5000$
- 网格中至少有一个空单元格。
你的程序将在满足以下限制的输入实例上进行测试:
| 子任务 | 分值 | 附加限制 |
|---|---|---|
| 0 | 0 | 样例测试用例 |
| 1 | 5 | $h = 1$ |
| 2 | 7 | $h, w \le 80$ |
| 3 | 16 | $h, w \le 500$ |
| 4 | 32 | $h, w \le 2000$ |
| 5 | 40 | 无附加限制 |
样例
输入 1
3 3 000 011 010
输出 1
46
说明 1
如果单元格 $(1, 1), (1, 2), (1, 3), (2, 1)$ 或 $(3, 1)$ 最初被淹没,整个网格将在过程结束后被淹没。如果单元格 $(3, 3)$ 最初被淹没,则在该过程结束后只有 $1$ 个单元格会被淹没。因此,输出为 $9 + 9 + 9 + 9 + 9 + 1 = 46$。
输入 2
5 5 00101 01011 11010 01101 11000
输出 2
182
输入 3
1 10 1101011100
输出 3
6