#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
typedef long double ld;
#define REP(i,n) for(int i=0, i##_len=(n); i<i##_len; ++i)
#define REPR(i,n) for(int i=n; i>-1; --i)
#define ALL(a) (a).begin(),(a).end()
#define FILL(a,n,x); REP(i,(n)){ (a)[i]=(x); }
#define CINA(a,n); REP(i,(n)){ cin >> (a)[i]; }
#define FILL2(a,n,m,x); REP(i,(n)){ REP(j,(m)){(a)[i][j]=(x);} }
#define CINA2(a,n,m); REP(i,(n)){ REP(j,(m)){cin >> (a)[i][j];} }
#define Liny "Yes\n"
#define Linn "No\n"
#define LINY "YES\n"
#define LINN "NO\n"

//cout << setfill('0') << right << setw(4) << 12; // "0012"
int keta(ll x){ if(x<10){return 1;} else{return keta(x/10) + 1;}}
int keta_wa(ll x){ if(x<10){return x;} else{return keta_wa(x/10) + x%10;} }
int ctoi(char c){ return ( (c>='0' && c<='9')? c - '0': 0 );}
int __stoi(string s){ return atoi(s.c_str()); }
ll sum(ll a[],ll N){ return accumulate(a,a+N,0LL);}
ll gcd(ll a,ll b){if(a<b)swap(a,b); return b?gcd(b,a%b):a;}
ll lcm(ll a,ll b){if(a<b){swap(a,b);} return a/gcd(a,b)*b;}
template<class T> void chmax(T& a, T b){ if(a<b){a=b;} }
template<class T> void chmin(T& a, T b){ if(a>b){a=b;} }
template<class T> bool isIn(T a,vector<T> v){ for(T x:v){ if(a==x){return true;}} return false;}
string strReplace(string s,string target, string replacement){
    if (!target.empty()) {
      std::string::size_type pos = 0;
      while ((pos = s.find(target, pos)) != std::string::npos) {
        s.replace(pos, target.length(), replacement);
        pos += replacement.length();
      }
    }
    return s;
}
const ll MOD = 998244353;
#define pii pair<int,int>
#define pll pair<ll,ll>
#define MP make_pair



int main(){
    int H,W; cin>>H>>W;
    string board[H]; CINA(board,H);
    bool visit[H][W]; FILL2(visit,H,W,false);
        
    ll ans = 0;
    
    REP(i,H){
        REP(j,W){
            
            if(board[i][j]=='.'){ continue; }
            if(visit[i][j]){ continue; }
            // cout << i << j << "\n";
            queue<pii> q;
            q.push( MP(i,j) );
            visit[i][j] = 1;
            ll num_b = 1;
            ll num_w = 0;
            
            
            while(!q.empty()){
                int cur_i = q.front().first;
                int cur_j = q.front().second;
                // cout << "-" << cur_i << cur_j << "\n";
                q.pop();
                
                for(pii p:{ MP(cur_i,cur_j-1),MP(cur_i,cur_j+1),MP(cur_i-1,cur_j),MP(cur_i+1,cur_j)  }){
                    int next_i = p.first;
                    int next_j = p.second;
                    if( (next_i>=0 && next_i<H) && (next_j>=0 && next_j<W) ){
                        if(board[cur_i][cur_j]!=board[next_i][next_j]){
                            pii p_next = MP(next_i,next_j);
                            if(!visit[next_i][next_j]){
                                q.push( MP(next_i,next_j) );
                                visit[next_i][next_j] = true;
                                if(board[next_i][next_j]=='.'){
                                    ++num_w;
                                }else{
                                    ++num_b;
                                }
                            }
                        }
                    }
                }
                
            }
            // cout << "\n";
            ans += num_b*num_w;
        }
    }
    cout << ans << "\n";
}


Measured memory_bytes: 640