JOI 委员会决定制作一面新的 JOI 旗,以支持前往台湾参加比赛的选手。
JOI 旗是一个由 $M$ 行 $N$ 列正方形组成的矩形,每个正方形中都写有一个字符,字符为 'J'、'O' 或 'I' 中的一个。
JOI 旗示例
JOI 委员会还定义了一个“JOI 纹章”。JOI 纹章是一个由 2 行 2 列正方形组成的矩形,每个正方形中也写有一个字符,字符为 'J'、'O' 或 'I' 中的一个。
JOI 纹章示例
JOI 旗中包含的 JOI 纹章数量,是指在 JOI 旗中,字符排列与 JOI 纹章完全一致(不进行旋转或翻转)的 2 行 2 列区域的个数。即使满足条件的 2 行 2 列区域之间存在重叠,也应分别计数。
JOI 委员会拥有一面旧的 JOI 旗和一张白纸。白纸的大小与构成 JOI 旗的一个正方形相同,可以在上面写下 'J'、'O' 或 'I' 中的任意一个字符。JOI 委员会决定通过以下任一操作来制作新的 JOI 旗:
- 不对旧的 JOI 旗进行任何操作,直接将其作为新的 JOI 旗。此时不使用白纸。
- 在白纸上写下一个字符,并将其覆盖在旧 JOI 旗的任意一个正方形上,从而改变旧 JOI 旗中的一个位置。将修改后的旗帜作为新的 JOI 旗。
JOI 委员会希望尽可能多地增加新 JOI 旗中包含的 JOI 纹章数量。你需要求出新 JOI 旗中包含的 JOI 纹章数量的最大值。
题目描述
给定旧 JOI 旗和 JOI 纹章的信息,编写一个程序来计算新 JOI 旗中包含的 JOI 纹章数量的最大值。
输入格式
从标准输入读取以下数据:
- 第 1 行包含两个整数 $M$ 和 $N$,以空格分隔。这表示 JOI 旗是一个 $M$ 行 $N$ 列的矩形。
- 接下来的 $M$ 行,每行包含一个长度为 $N$ 的字符串。每个字符为 'J'、'O' 或 'I'。其中第 $i$ 行($1 \le i \le M$)的第 $j$ 个字符($1 \le j \le N$)表示旧 JOI 旗中第 $i$ 行第 $j$ 列的字符。
- 接下来的 2 行,每行包含一个长度为 2 的字符串。每个字符为 'J'、'O' 或 'I'。其中第 $i$ 行($1 \le i \le 2$)的第 $j$ 个字符($1 \le j \le 2$)表示 JOI 纹章中第 $i$ 行第 $j$ 列的字符。
输出格式
在标准输出中,输出一行,表示新 JOI 旗中包含的 JOI 纹章数量的最大值。
数据范围
所有输入数据满足以下条件:
- $2 \le M \le 1000$
- $2 \le N \le 1000$
子任务
子任务 1 [30 分]
满足以下条件: $M \le 50$ $N \le 50$
子任务 2 [70 分]
没有额外限制。
样例
输入 1
3 5 JOIJO IJOOO IIJIJ JO IJ
输出 1
3
说明 1
旧 JOI 旗和 JOI 纹章如题中所述。如果使用白纸将从上往下第 2 行、从左往右第 4 列的正方形改为 'J',则旗帜变为如下形状:
修改了 1 处位置的 JOI 旗示例
修改后的 JOI 旗中,有 3 处区域的配置与 JOI 纹章相同:
与 JOI 纹章配置相同的区域
由于不存在配置与 JOI 纹章相同的区域达到 4 处或以上的新的 JOI 旗,因此新 JOI 旗中包含的 JOI 纹章数量的最大值为 3。
输入 2
2 6 JOJOJO OJOJOJ OJ JO
输出 2
2
说明 2
请注意,即使不使用白纸,也可能获得最大值。
输入 3
2 2 JI IJ JJ JJ
输出 3
0
说明 3
对于此样例,在任何可能的新 JOI 旗中,都不包含任何 JOI 纹章。