003 - JOI紋章
時間制限 1 秒 / メモリ制限 256 MB / 得点 100 / x 6 /
問題
情報オリンピック日本委員会では,台湾大会に向かう選手を応援するために新しいJOI 旗を作成することにした.
JOI 旗は,正方形が縦に M 行,横に N 列並んだ形をしており,各正方形には J,O,I のいずれかの文字が1 つずつ書かれている.
情報オリンピック日本委員会はJOI 旗とは別にJOI 紋章というものを決めている.JOI 紋章は,正方形が縦に2 行,横に2 列並んだ形をしており,各正方形にはJ,O,I のいずれかの文字が1 つずつ書かれている.
JOI 旗に含まれるJOI 紋章の個数とは,JOI 旗に含まれる縦2 行,横2 列の領域のうち,その領域のJ,O,I の配置がJOI 紋章と(回転や裏返しをせずに) 一致しているものの個数のことである.条件を満たす縦2 行,横2 列の領域同士が重なっていてもそれらを別々に数えるものとする.
情報オリンピック日本委員会は古いJOI 旗と1 枚の白紙を持っている.白紙はJOI 旗を構成する正方形1 個分の大きさで,J,O,I のうち好きな1 文字を書き込むことができる.情報オリンピック日本委員会は以下のいずれか1 つの操作をして,新しいJOI 旗を作成することにした.
- 古いJOI 旗に対して何も操作せず,そのまま新しいJOI 旗とする.白紙は使用しない.
- 白紙に1 文字書き込み,古いJOI 旗のいずれかの正方形に重ねて貼り付けることで古いJOI 旗のうち1 箇所を変更する.変更後のJOI 旗を新しいJOI 旗とする.
情報オリンピック日本委員会は新しいJOI 旗に含まれるJOI 紋章の個数をできるだけ多くしたいと思っている.あなたは新しいJOI 旗に含まれるJOI 紋章の個数の最大値を求めることになった.
課題
古いJOI 旗とJOI 紋章の情報が与えられたとき,新しいJOI 旗に含まれるJOI 紋章の個数の最大値を求めるプログラムを作成せよ.
入力
標準入力から以下のデータを読み込め.
- 1 行目には2 個の整数 M, N が空白を区切りとして書かれている.これはJOI 旗が正方形が縦にM行,横にN 列並んだ形であることを表している.
- 続くM 行の各行には,それぞれN 文字からなる文字列が書かれている.各文字はJ,O,I のいずれかであり,M 行のうち上からi 行目(1 ≤ i ≤ M) に書かれている文字列の左からj 文字目(1 ≤ j ≤ N)は古いJOI 旗の上からi 行目,左からj 列目の正方形に書かれている文字を表す.
- 続く2 行の各行には,それぞれ2 文字からなる文字列が書かれている.各文字はJ,O,I のいずれかであり,2 行のうち上からi 行目(1 ≤ i ≤ 2) に書かれている文字列の左からj 文字目(1 ≤ j ≤ 2) はJOI 紋章の上からi 行目,左からj 列目の正方形に書かれている文字を表す.
出力
標準出力に,新しいJOI 旗に含まれるJOI 紋章の個数の最大値を表す整数を1 行で出力せよ.
制約
すべての入力データは以下の条件を満たす.
- 2 ≤ M ≤ 1000
- 2 ≤ N ≤ 1000
入出力例
入力例 1 | 出力例 1 | |
---|---|---|
3 5 JOIJO IJOOO IIJIJ JO IJ |
3 |
古いJOI 旗とJOI 紋章は問題文中の例の通りである.上から2 行目,左から4 列目の正方形を白紙を用いてJ に変更すると,次のような形になる.
このように変更した後のJOI 旗には次に示す3 箇所にJOI 紋章と同じ配置の領域がある.
JOI 紋章と同じ配置の領域が4 箇所以上となる新しいJOI 旗は存在しないので,新しいJOI 旗に含まれるJOI 紋章の個数の最大値は3 である.
入力例 2 | 出力例 2 | |
---|---|---|
2 6 JOJOJO OJOJOJ OJ JO |
2 |
白紙を使用しなくても最大値が得られる場合があることに注意せよ.
入力例 3 | 出力例 3 | |
---|---|---|
2 2 JI IJ JJ JJ |
0 |
この入出力例の場合,考えられるどの新しいJOI 旗においても,JOI 紋章が1 つも含まれない.