#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int M, N;
if (!(cin >> M >> N)) return 0;
vector<string> flag(M);
for (int i = 0; i < M; ++i) {
cin >> flag[i];
}
vector<string> emblem(2);
for (int i = 0; i < 2; ++i) {
cin >> emblem[i];
}
auto is_match = [&](int r, int c) {
if (r < 0 || r >= M - 1 || c < 0 || c >= N - 1) return false;
return flag[r][c] == emblem[0][0] &&
flag[r][c + 1] == emblem[0][1] &&
flag[r + 1][c] == emblem[1][0] &&
flag[r + 1][c + 1] == emblem[1][1];
};
long long initial_count = 0;
for (int i = 0; i < M - 1; ++i) {
for (int j = 0; j < N - 1; ++j) {
if (is_match(i, j)) {
initial_count++;
}
}
}
long long max_gain = 0;
char candidates[] = {'J', 'O', 'I'};
for (int i = 0; i < M; ++i) {
for (int j = 0; j < N; ++j) {
int current_local = 0;
for (int dr = -1; dr <= 0; ++dr) {
for (int dc = -1; dc <= 0; ++dc) {
if (is_match(i + dr, j + dc)) {
current_local++;
}
}
}
char original = flag[i][j];
for (char c : candidates) {
if (c == original) continue;
flag[i][j] = c;
int new_local = 0;
for (int dr = -1; dr <= 0; ++dr) {
for (int dc = -1; dc <= 0; ++dc) {
if (is_match(i + dr, j + dc)) {
new_local++;
}
}
}
long long current_gain = (long long)new_local - current_local;
if (current_gain > max_gain) {
max_gain = current_gain;
}
}
flag[i][j] = original;
}
}
cout << initial_count + max_gain << endl;
return 0;
}