#include <stdio.h>
#include <string.h>
int main(void) {
int n, m;
scanf("%d%d", &n, &m);
char grid[1005][1005];
for (int i = 0; i < n; i++)
scanf("%s", grid[i]);
int visited[1005][1005];
memset(visited, 0, sizeof(visited));
int front = 0, rear = 0;
int qx[1005*1005], qy[1005*1005];
qx[rear] = 0, qy[rear] = 0;
rear++;
int ans = 0; //长方形连通块的数量
//遍历每个格子
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
//判断当前格子是否是'.'且未被访问
if (grid[i][j] == '.' && !visited[i][j]) {
front = rear = 0; // 清空队列
qx[rear] = i;
qy[rear] = j;
rear++;
visited[i][j] = 1;
//初始化连通块的边界
int min_x = i, max_x = i;
int min_y = j, max_y = j;
int cnt = 1; // 连通块中'.'的数量
//BFS遍历连通块
while (front < rear) {
int x = qx[front];
int y = qy[front];
front++;
//更新边界
if (x < min_x) min_x = x;
if (x > max_x) max_x = x;
if (y < min_y) min_y = y;
if (y > max_y) max_y = y;
// 遍历四个方向
int dx[4] = {-1, 1, 0, 0};
int dy[4] = { 0, 0, -1, 1};
for (int k = 0; k < 4; k++) {
int nx = x + dx[k];
int ny = y + dy[k];
// 判断是否在网格内且为'.'且未访问
if (nx >= 0 && nx < n && ny >= 0 && ny < m){
if(grid[nx][ny] == '.' && !visited[nx][ny]) {
visited[nx][ny] = 1;
qx[rear] = nx;
qy[rear] = ny;
rear++;
cnt++;
}
}
}
}
// 计算包围盒的面积
int area = (max_x - min_x + 1) * (max_y - min_y + 1);
// 如果连通块中'.'的数量等于包围盒面积则是长方形
if (cnt == area)
ans++;
}
}
}
printf("%d\n", ans);
return 0;
}