【题目描述】
日本信息学奥赛委员会为了应援将要去台湾参加 IOI 的选手们,打算制作一面新的 JOI 旗帜 。JOI
旗帜为由 M 行 N 列的 M*N 个正方形组 成的图形,每个正方形里写有 J,O,I 中任一字母。
日本信息学奥赛委员会还决定制作 JOI 徽章 。JOI 徽章为由 2 行 2 列的 4 个
正方形组成的图形,每个正方形里写有 J,O,I 中任一字母。
JOI 旗帜中所含 JOI 徽章的个数的意思是,JOI 旗帜中的与 JOI 徽章相同(不允许翻转或旋转)的 22 区域的个数。
现在日本信息学奥赛委员会拥有一张旧的 JOI 旗帜和一张白纸。这张白纸的大小和一个构成 JOI 旗的正方形的大小相同。可以在这张白纸上写上 J,O,I 中任一字母。日本信息学奥赛委员会将进行以下任意一种操作来制作新的 JOI 旗帜。
1.不进行任何操作,直接把旧的旗帜当新的用。不使用白纸。
2.在白纸上写下一个字母,将白纸覆盖在旧的 JOI 旗帜的任意一个正方形上(也就是变更旧的 JOI 旗帜的一个正方形的字母)。
日本信息学奥赛委员会想让新的 JOI 旗帜所含的 JOI 徽章的数量尽可能多。请求出新的 JOI 旗帜所含的 JOI 徽章的个数的最大值。
【输入格式】
第一行为两个以空格分开的整数 M、N 。表示旧的 JOI 旗帜是由 M 行 N 列的 MN 个正方形组成的图形。
接下来的 M 行,每行为含有 N 个字符的字符串。每个字符为 J,O,I 中的一个。这 M 行中的第 i 行中从左数第 j 个字符表示旧的 JOI 旗帜上的第 i 行第 j 列的正方形中所写的字符。
接下来的 2 行,每行为含有 2 个字符的字符串。每个字符为 J,O,I 中的一个。这 2 行中的第 i 行中从左数第 j 个字符表示 JOI 徽章上的第 i 行第 j 列的正方形中所写的字符。
【输出格式】
输出一行一个整数:表示新的 JOI 旗帜所含的 JOI 徽章的个数的最大值。
【样例1】
input
3 5
JOIJO
IJOOO
IIJIJ
JO
IJ
output
3
【数据规模与约定】
对于 30% 的数据, 1≤M≤50,1≤N≤50 。
对于 100% 的数据, 1≤M≤1000,1≤N≤1000。
暴力跑一遍求原本的答案,再替换后计算 Δ a n s \Delta ans Δans
#include<cstdio>
#include<algorithm>
using namespace std;
# define Type template<typename T>
# define read read1<int>()
Type inline T read1()
{
T t=0;
bool ty=0;
char k;
do k=getchar(),(k=='-')&&(ty=1);while(