import java.util.*;
import java.io.*;
public class Main{
static int n, m, bsum, wsum, bcnt= 0, wcnt= 0;
static boolean[][] visited;
static int[][] arr;
static int[] dx={1, 0, -1, 0};
static int[] dy={0, 1, 0, -1};
static Queue<int[]> q= new LinkedList<>();
public static void main(String[]args)throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
n= Integer.parseInt(st.nextToken());
m= Integer.parseInt(st.nextToken());
arr= new int[m][n];
visited= new boolean[m][n];
for(int i = 0; i <m; i++) {
String str = br.readLine();
for(int j = 0; j <n; j++) {
if(str.charAt(j)== 'B') {
arr[i][j]= 1;
}else
arr[i][j]= 0;
}
}
for(int i=0; i<m; i++){
for(int j=0; j<n; j++){
if(arr[i][j]==1 && !visited[i][j]){
bcnt++;
fn(i, j, 'B');
bsum+=Math.pow(bcnt, 2);
bcnt=0;
}
}
}
//초기화
q= new LinkedList<>();
for(int i = 0; i <m; i++) {
for(int j = 0; j <n; j++) {
visited[i][j]= false;
}
}
for(int i=0; i<m; i++){
for(int j=0; j<n; j++){
if(arr[i][j]==0 && !visited[i][j]){
wcnt++;
fn(i, j, 'W');
wsum+=Math.pow(wcnt, 2);
wcnt=0;
}
}
}
System.out.println(wsum+ " " +bsum);
}
public static void fn(int x, int y, char c) {
q.add(new int[]{x, y});
visited[x][y]= true;
while(!q.isEmpty()) {
int[]xy =q.poll();
for(int i = 0; i < 4; i++) {
int nx = xy[0]+dx[i];
int ny = xy[1]+dy[i];
//값이 넘어가거나 이미 체크했다면 넘어가고
if(nx < 0 || nx >=m|| ny < 0 || ny >=n||visited[nx][ny])
continue;
//B를 찾는 경우 : B를 1로 체크했기 떄문에 0이면 지나가고
if(c == 'B' &&arr[nx][ny]== 0)
continue;
//W를 찾는 경우 : W는 0으로 체크했기 때문에 1이면 지나가고
if(c == 'W' &&arr[nx][ny]== 1)
continue;
//조건에 걸리지않았다면 체크하고
visited[nx][ny]= true;
//큐에 집어넣고
q.add(new int[]{nx, ny});
//여기부분이 다음 인덱스로 넘어가면서 진행되는 부분이고
if(c == 'B') {
bcnt++;
}else{
wcnt++;
}
}
//여기부분이 하나의 점에서 다움직이면 넘어가는 곳
// System.out.println("bcnt : " + bcnt);
}
}
}