#include <stdio.h>

char str[16][16];

/*
void erase(int x, int y)
{
	if (x < 0 || x > 11 || y < 0 || y > 11) return;
	if (str[y][x] == '0') return;
	
	str[y][x] = '0';
	
	erase(x + 1, y);
	erase(x, y + 1);
	erase(x - 1, y);
	erase(x, y - 1);
}
*/

void is(int i, int j)
{
	int n;
	int k;
	
	str[i][j] = '0';
	
	k = 1;
	for (n = 0; n < 2; n++){
		if (str[i + k][j] == '1' && i + k >= 0 && i + k < 12){
			is(i + k, j);
		}
		if (str[i][j + k] == '1' && j + k >= 0 && j + k < 12){
			is(i, j + k);
		}
		k = -1;
	}
}

int main(void)
{
	int i, j;
	int ans;
	int a;
//	int case_ = 0;
	 
	while (1){
//		if (case_) fgets(str[0], 16, stdin);
//		case_++;
		ans = 0;
		for (i = 0; i < 12; i++){
			if (fgets(str[i], 16, stdin) == NULL){
				return (0);
			}
		}
		for (i = 0; i < 12; i++){
			for (j = 0; j < 12; j++){
				if (str[i][j] == '1'){
					is(i, j);
					str[i][j] = '1';
					ans++;
				}
			}
		}
		printf("%d\n", ans);
		if (fgets(str[0], 16, stdin) == NULL) return(0);
	}
}
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

typedef long long LL;

const int MAXN=400;

LL n, m, ans, cntW, cntB;
bool visited[MAXN][MAXN];
string s[MAXN];

bool avail(int i, int j, char c){
	if(i < 0 || i >= n || j < 0 || j >= m) return false;
	if(s[i][j] == c) return false;
	return true;
}

void dfs(int i, int j){
	if(i < 0 || i >= n || j < 0 || j >= m) return;
	if(visited[i][j]) return;

	visited[i][j] = true;
	if(s[i][j] == '.') cntW++;
	else cntB++;
	if(avail(i, j - 1, s[i][j])) dfs(i, j - 1);
	if(avail(i, j + 1, s[i][j])) dfs(i, j + 1);
	if(avail(i + 1, j, s[i][j])) dfs(i + 1, j);
	if(avail(i - 1, j, s[i][j])) dfs(i - 1, j);
}

int main(){
	cin >> n >> m;
	for(int i = 0; i < n; i++) cin >> s[i];

	for(int i = 0; i < n; i++)
		for(int j = 0; j < m; j++)
			visited[i][j] = false;

	ans = 0;
	for(int i = 0; i < n; i++)
		for(int j = 0; j < m; j++)
			if(!visited[i][j]){
				cntB = 0; cntW = 0;

				dfs(i, j);
				ans += cntB * cntW;
			}
	cout << ans << "\n";
}