using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
//連結成分ごとに分解する
//範囲内のΣ(黒*白)が答えとなる

class Program
{
    static void Main()
    {
        int[] In = Console.ReadLine().Split(' ').Select(x => int.Parse(x)).ToArray();
        h = In[0];
        w = In[1];
        fi = new char[h,w];
        for (int i = 0; i < h; i++)
        {
            string In2 = Console.ReadLine();
            for (int j = 0; j < w; j++)
            {
                fi[i, j] = In2[j];
            }
        }
        long res = 0;
        for(int x = 0; x < h; x++)
        {
            for(int y = 0; y < w; y++)
            {
                if (fi[x, y] == '.') continue;
                if (seen[x, y]) continue;
                numb = 0; numw = 0;//黒マスと白マスの個数を0で初期化
                DFS(x, y);
                res += numb * numw;
            }
        }
        Console.WriteLine(res);
    }
    static public int Max = 410;
    static public int h, w;
    static public long numb, numw;
    static public char[,] fi;
    static public bool[,] seen=new bool[Max,Max];
    static public int[] dx = new int[]{ 1, 0, -1, 0 };
    static public int[] dy = new int[]{ 0, 1, 0, -1 };
    static public void DFS(int x,int y)
    {
        seen[x, y] = true;
        if (fi[x, y] == '#') ++numb;
        else ++numw;
        for (int dir = 0; dir< 4; ++dir)
        {
            int nx = x + dx[dir];
            int ny = y + dy[dir];
            if (nx < 0 || nx >= h || ny < 0 || ny >= w) continue;
            if (fi[x,y] == fi[nx,ny]) continue; // 隣接マスの色が同じだったら分断されている
            if (seen[nx,ny]) continue;
            DFS(nx, ny);
        }
    }
}

//TLE
//namespace C
//{
//    class Program
//    {
//        static void Main(string[] args)
//        {
//            int[] In = Console.ReadLine().Split(' ').Select(x => int.Parse(x)).ToArray();
//            h = In[0];
//            w = In[1];
//            M = new char[h, w];
//            for(int i=0; i < h; i++)
//            {
//                string In2 = Console.ReadLine();
//                for(int j = 0; j < w; j++)
//                {
//                    M[i, j] = In2[j];
//                }
//            }
//            ans = 0;
//            //始める点(#)
//            for(int i = 0; i < h; i++)
//            {
//                for(int j=0; j < w; j++)
//                {
//                    if (M[i, j] == '.') continue;
//                    //終える点(.)
//                    for (int x = 0; x < h; x++)
//                    {
//                        for(int y = 0; y < w; y++)
//                        {
//                            if (M[x, y] == '#') continue;
//                            B = new bool[h, w];
//                            dis = (int)(Math.Abs(i - x) + Math.Abs(j - y));
//                            Chk(i, j, x, y, 0);
//                        }
//                    }
//                }
//            }
//            Console.WriteLine(ans);
//        }
//        static public int h, w;
//        static public int ans;
//        static public char[,] M;
//        static public bool[,] B;
//        static public int dis;
//        static public void Chk(int x1,int y1, int x2, int y2, int cnt)
//        {
//            if (cnt % 2 == 0) if (M[x1, y1] == '.') return;
//            if (cnt % 2 == 1) if (M[x1, y1] == '#') return;
//            if (dis == cnt)
//            {
//                if (x1 == x2 && y1 == y2 && !B[x1,y1]) { ans++; B[x1,y1]=true; }
//                return;
//            }
//            cnt++;
//            //上
//            if (0 <= x1 - 1) Chk(x1 - 1, y1, x2, y2, cnt);
//            //下
//            if (x1 + 1 <  h) Chk(x1 + 1, y1, x2, y2, cnt);
//            //左
//            if (0 <= y1 - 1) Chk(x1, y1 - 1, x2, y2, cnt);
//            //右
//            if (y1 + 1 <  w) Chk(x1, y1 + 1, x2, y2, cnt);

//        }

//    }
//}


Measured memory_bytes: 38768