Problem: There is a grid with H rows and W columns, where each square is painted black or white.

You are given H strings S_1, S_2, ..., S_H, each of length W. If the square at the i-th row from the top and the j-th column from the left is painted black, the j-th character in the string S_i is `#`; if that square is painted white, the j-th character in the string S_i is `.`.

Find the number of pairs of a black square c_1 and a white square c_2 that satisfy the following condition:

* There is a path from the square c_1 to the square c_2 where we repeatedly move to a vertically or horizontally adjacent square through an alternating sequence of black and white squares: black, white, black, white...

Constraints

* 1 \leq H, W \leq 400
* |S_i| = W (1 \leq i \leq H)
* For each i (1 \leq i \leq H), the string S_i consists of characters `#` and `.`.

Input

Input is given from Standard Input in the following format:


H W
S_1
S_2
:
S_H


Output

Print the answer.

Examples

Input

3 3
.#.
..#
#..


Output

10


Input

3 3
.#.
..#
..


Output

10


Input

2 4
....
....


Output

0


Input

4 3


...


Output

6

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
 
typedef pair<int,int > pp;
typedef long long ll;
 
int const N=2e5+2,oo=1e9,M=1e6;
ll const OO=1e18;
double const eps=1e-6,PI=acos(-1);
int mod=oo+7;

int n,m,dp[401][401],vis[401][401];
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
string aa[401];
bool valid(int r,int c){
    return r>-1&&r<n&&c>-1&&c<m;
}
pp dfs(int r,int c){
    vis[r][c]=1;
    pp ret={aa[r][c]=='.',aa[r][c]=='#'};
    for(int i=0;i<4;i++){
        int nr=r+dy[i],nc=c+dx[i];
        if(valid(nr,nc)&&aa[nr][nc]!=aa[r][c]&&!vis[nr][nc]){
            pp t=dfs(nr,nc);
            ret.first+=t.first;
            ret.second+=t.second;
        }
    }
    return ret;
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin>>n>>m;
    ll an=0;
    for(int i=0;i<n;i++)cin>>aa[i];
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(vis[i][j])continue;
            pp ret=dfs(i,j);
            an+=ret.first*1LL*ret.second;
        }
    }
    cout<<an<<'\n';
    return 0;
}