#P15811. [JOI 2014 Final] JOI 紋章

[JOI 2014 Final] JOI 紋章

说明

国际信息学奥林匹克日本委员会为了给参加台湾大赛的选手加油,决定制作一面新的 JOI 旗。

JOI 旗的形状是正方形纵向排列 MM 行、横向排列 NN 列,每个正方形上写有 J, O, I 中的一个字符。

:::align{center}

JOI 旗示例 :::

国际信息学奥林匹克日本委员会除了 JOI 旗之外,还规定了一种 JOI 纹章JOI 纹章 的形状是正方形纵向排列 22 行、横向排列 22 列,每个正方形上写有 J, O, I 中的一个字符。

:::align{center}

JOI 纹章示例 :::

JOI 旗中包含的 JOI 纹章 的数量,是指 JOI 旗中包含的纵向 22 行、横向 22 列的区域中,该区域内 J, O, I 的布局与 JOI 纹章(不经过旋转或翻转)一致的区域的个数。即使满足条件的纵向 22 行、横向 22 列区域相互重叠,也应分别计数。

国际信息学奥林匹克日本委员会有一面旧的 JOI 旗和一张白纸。白纸的大小与构成 JOI 旗的一个正方形相同,可以在上面写下 J, O, I 中的任意一个字符。国际信息学奥林匹克日本委员会决定通过以下两种操作之一来制作新的 JOI 旗:

  • 不对旧的 JOI 旗进行任何操作,直接将其作为新的 JOI 旗。不使用白纸。
  • 在白纸上写下一个字符,然后将其覆盖粘贴到旧的 JOI 旗的任意一个正方形上,从而更改旧的 JOI 旗中的一个位置。将更改后的 JOI 旗作为新的 JOI 旗。

国际信息学奥林匹克日本委员会希望新的 JOI 旗中包含的 JOI 纹章 的数量尽可能多。你需要求出新的 JOI 旗中包含的 JOI 纹章 的最大数量。

任务

给定旧的 JOI 旗和 JOI 纹章 的信息,编写一个程序,求出新的 JOI 旗中包含的 JOI 纹章 的最大数量。

输入格式

从标准输入读取以下数据。

  • 第一行包含两个用空格分隔的整数 M,NM, N。这表示 JOI 旗是正方形纵向排列 MM 行、横向排列 NN 列的形状。
  • 接下来的 MM 行,每行包含一个长度为 NN 的字符串。每个字符是 J, O, I 中的一个,MM 行中从上数第 ii 行 (1iM1 \le i \le M) 的字符串从左数第 jj 个字符 (1jN1 \le j \le N) 表示旧的 JOI 旗中从上数第 ii 行、从左数第 jj 列的正方形上写的字符。
  • 接下来的 22 行,每行包含一个长度为 22 的字符串。每个字符是 J, O, I 中的一个,22 行中从上数第 ii 行 (1i21 \le i \le 2) 的字符串从左数第 jj 个字符 (1j21 \le j \le 2) 表示 JOI 纹章 中从上数第 ii 行、从左数第 jj 列的正方形上写的字符。

输出格式

向标准输出输出一行,包含一个整数,表示新的 JOI 旗中包含的 JOI 纹章 的最大数量。

3 5
JOIJO
IJOOO
IIJIJ
JO
IJ
3
2 6
JOJOJO
OJOJOJ
OJ
JO
2
2 2
JI
IJ
JJ
JJ
0

提示

样例解释 1

旧的 JOI 旗和 JOI 纹章 与题目描述中的示例相同。如果使用白纸将从上数第 22 行、从左数第 44 列的正方形更改为 J,则会变成如下形状:

:::align{center}

更改 JOI 旗一处位置的示例 :::

这样更改后的 JOI 旗 中,有以下 33 处区域与 JOI 纹章 的布局相同:

:::align{center}

与 JOI 纹章布局相同的区域 :::

不存在包含 44 处或以上与 JOI 纹章 布局相同的区域的新 JOI 旗,因此新的 JOI 旗中包含的 JOI 纹章 的最大数量是 33

样例解释 2

请注意,有时不使用白纸也能得到最大值。

样例解释 3

对于此样例,在任何可能的新 JOI 旗 中,都不包含任何 JOI 纹章

限制

所有输入数据满足以下条件:

  • 2M10002 \le M \le 1000
  • 2N10002 \le N \le 1000

子任务

子任务 1 [30 分]

满足以下条件:

  • M50M \le 50
  • N50N \le 50

子任务 2 [70 分]

无额外限制。


翻译由 DeepSeek V3.2 完成