#include <bits/stdc++.h>
#include <set>
#include <iterator>
using namespace std;

#define ft first
#define sd second
#define pb push_back
#define all(x) x.begin(),x.end()

#define ll long long int
#define vi vector<int>
#define vii vector<pair<int,int> >
#define pii pair<int,int>
#define plii pair<pair<ll, int>, int>
#define piii pair<pii, int>
#define viii vector<pair<pii, int> >
#define vl vector<ll>
#define vll vector<pair<ll,ll> >
#define pll pair<ll,ll>
#define pli pair<ll,int>
#define mp make_pair
#define ms(x, v) memset(x, v, sizeof x)
#define pr_vec(v) for(int i=0;i<v.size();i++) cout << v[i] << " " ;

#define f_in(st) freopen(st,"r",stdin)
#define f_out(st) freopen(st,"w",stdout)

#define fr(i, a, b) for(i=a; i<=b; i++)
#define fb(i, a, b) for(i=a; i>=b; i--)
#define ASST(x, l, r) assert( x <= r && x >= l )
const int  p=31,po=1,N=410, M=(ll)1e9+1 ;
const int mod = 998244353 ;
// struct node{
//   ll prefixsum,suffixsum,bettersum,totalsum;
//   void create(ll val){
//     prefixsum=suffixsum=bettersum=val;
//   }
//   void Merge(node& a,node &b){
//     prefixsum=max(a.prefixsum,a.totalsum+b.prefixsum);
//     suffixsum=max(b.suffixsum,a.suffixsum+b.sum);
//     totalsum=a.totalsum+b.totalsum;
    
//   }
// }
//ll dp[2][100];
vl compute(string s){
        vl has(s.length());
        ll i;

        for(i=0;i<s.length();i++){
            if(i==0){
                has[i]=((s[i]-'a'+1))%mod;
            }
            else
                has[i]=(has[i-1]*p + (s[i]-'a'+1))%mod;
        }
        return has;
}
// ll g[N][N],keep[N*N];

// ll solve(ll l,ll r){
//   if(l==r)
//     return l;
//   ll n1=solve(l,(l+r)/2);
//   ll n2=solve((l+r)/2 +1,r);
//   if(g[n1][n2]>0){
//     keep[g[n1][n2]]=true;
//     return n1;
//   }
//   else{
//     keep[g[n2][n1]]=true;
//     return n2;
//   }
// }
  ll h,w;

vl g[N*N];
bool check(ll i,ll j){
   return (i<=h && j<=w && i>0 && j>0);
}
ll getc(ll i,ll j){
  return h*(i-1)+j;
}
// vector<bool> vis(410*410,false);
ll b,wh;
ll ga[N][N],vis[N][N]={0};
void dfs(ll i,ll j,ll c){
  // cout  << i << " " << j << endl;
  if(ga[i][j]!=c)
    return ;
  if(i<=0 || j<=0 || i>h || j>w)
    return;
  if(vis[i][j])
    return ;
  vis[i][j]=1;
  b+=ga[i][j];
  wh+=(!ga[i][j]);
  dfs(i+1,j,c^1);
  dfs(i-1,j,c^1);
  dfs(i,j+1,c^1);
  dfs(i,j-1,c^1);
}
// ll dfs(ll x,ll c){
//   vis[x]=true;
//   if(c)
//     b++;
//   else
//     wh++;
//   for(auto it:g[x]){
//     if(!vis[it]){
//       dfs(it,1-c);
//     }
//   }
//   return b*wh;
// }
int main(){
 ios_base::sync_with_stdio(0);
  cin >> h >> w;
  ll i,j;
  for(i=1;i<=h;i++){
    string s;
    cin >> s;
    for(j=1;j<=w;j++){
        ga[i][j]=(s[j-1]=='#');
    }
  }
  for(i=1;i<=h;i++){
    for(j=1;j<=w;j++){
        ll c=getc(i,j);
        if(check(i-1,j) && ga[i][j]!=ga[i-1][j])
          g[c].pb(c-w);
        if(check(i+1,j) && ga[i][j]!=ga[i+1][j])
          g[c].pb(c+w);
        if(check(i,j+1) && ga[i][j]!=ga[i][j+1])
          g[c].pb(c+1);
        if(check(i,j-1) && ga[i][j]!=ga[i][j-1])
          g[c].pb(c-1);
          
    }
  }
  ll ans=0;
  for(i=1;i<=h;i++){
    for(j=1;j<=w;j++)
    if(!vis[i][j]){
      b=0;
      wh=0;
      dfs(i,j,ga[i][j]);
      // cout << b << " " << wh << endl; 
      ans+=b*wh;
      // cout << i << " " << ans << endl;
    }
      
  }
  cout << ans;
    return 0;
}

Measured memory_bytes: 26752