#include <iostream>
#include <vector>
#include <unordered_map>
#include <string>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
// 若矩阵行数少于 3 或者列数少于 2,无法截取 3x2 子矩阵,直接输出 10 个 0
if (m < 2 || n < 3) {
cout << "0 0 0 0 0 0 0 0 0 0" << endl;
return 0;
}
// 预定义的 10 种模式
vector<string> patterns = {
"*.....", // 1
"*.*...", // 2
"**....",// 3
"**.*..", //4
"*..*..", // 5
"***...", // 6
"****..", // 7
"*.**..", // 8
".**...", // 9
".***..", // 0
};
// 建立模式字符串到索引的映射
unordered_map<string, int> patternToIndex;
for (int i = 0; i < patterns.size(); ++i) {
patternToIndex[patterns[i]] = i;
}
// 存储输入的矩阵
vector<string> matrix(n);
for (int i = 0; i < n; ++i) {
cin >> matrix[i];
}
// 存储每种模式的匹配次数
int matchedIndices[10] = {0};
// 遍历矩阵,提取所有可能的 3x2 子矩阵
for (int col = 0; col <= m - 2; ++col) {
for (int row = 0; row <= n - 3; ++row) {
// 提取 3x2 子矩阵并转换为字符串
string subMatrix = "";
for (int i = 0; i < 3; ++i) {
subMatrix += matrix[row + i].substr(col, 2);
}
// 检查提取的子矩阵是否与预定义模式匹配
if (patternToIndex.find(subMatrix) != patternToIndex.end()) {
// 若匹配,对应模式的匹配次数加 1
matchedIndices[patternToIndex[subMatrix]]++;
}
}
}
// 按要求格式输出每种模式的匹配次数
for (int i = 0; i < 10; ++i) {
if (i > 0) {
cout << " ";
}
cout << matchedIndices[i];
}
return 0;
}