#include <stdio.h>
int main() {
int n, m; // 定义网格的行数和列数
scanf("%d %d", &n, &m); // 读取网格的行数和列数
char grid[50][50]; // 定义一个最大支持 50x50 的网格
// 输入网格数据
for (int i = 0; i < n; i++) {
scanf("%s", grid[i]); // 读取网格的每一行
}
int count = 0; // 计数器,用来统计符合条件的2x2方格数量
// 遍历所有可能的2x2方格的左上角位置
for (int i = 0; i < n - 1; i++) { // 行范围:0 到 n-2
for (int j = 0; j < m - 1; j++) { // 列范围:0 到 m-2
// 获取当前2x2方格的四个字符
char chars[4] = {
grid[i][j], // 左上
grid[i][j+1], // 右上
grid[i+1][j], // 左下
grid[i+1][j+1] // 右下
};
// 用一个简单的数组来模拟集合,避免重复
char unique_chars[4]; // 用于存储不重复的字符
int unique_count = 0; // 用于记录唯一字符的数量
// 遍历 4 个字符,去重
for (int k = 0; k < 4; k++) {
int found = 0; // 记录是否已经存在该字符
for (int l = 0; l < unique_count; l++) {
if (chars[k] == unique_chars[l]) {
found = 1; // 如果字符已经在 unique_chars 中,标记为已找到
break;
}
}
if (!found) { // 如果字符没有重复,则加入到 unique_chars 中
unique_chars[unique_count++] = chars[k];
}
}
// 判断是否包含 'f', 'a', 'c', 'e' 四个字符
if (unique_count == 4) {
int has_f = 0, has_a = 0, has_c = 0, has_e = 0;
// 检查每个字符是否存在
for (int k = 0; k < 4; k++) {
if (unique_chars[k] == 'f') has_f = 1;
if (unique_chars[k] == 'a') has_a = 1;
if (unique_chars[k] == 'c') has_c = 1;
if (unique_chars[k] == 'e') has_e = 1;
}
// 如果包含 'f', 'a', 'c', 'e',则计数
if (has_f && has_a && has_c && has_e) {
count++;
}
}
}
}
// 输出符合条件的2x2方格数量
printf("%d\n", count);
return 0;
}