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;

int H, W;
vector<string> S;
vector<vector<int>> reach;
long long cntBlack = 0;
long long cntWhite = 0;

void search(int h, int w){
    if(S[h][w]=='#') cntBlack++;
    if(S[h][w]=='.') cntWhite++;

    reach[h][w] = 1;
    int dh[4] = {-1, 1, 0, 0};
    int dw[4] = {0, 0, -1, 1};
    for(int i=0; i<4; i++){
        int nh = h + dh[i];
        int nw = w + dw[i];
        if(0 <= nh && nh < H && 0 <= nw && nw < W && S[nh][nw] != S[h][w] && reach[nh][nw] == 0){
            search(nh,nw);
        }    
    }
}

int main(){
    cin >> H >> W;
    S = vector<string>(H);
    reach = vector<vector<int>>(H, vector<int>(W, 0));
    for(int i=0; i<H; i++)  cin >> S[i];

    long long ans = 0;
    for(int h=0; h<H; h++){
        for(int w=0; w<W; w++){
            cntBlack = 0;
            cntWhite = 0;
            if(reach[h][w] != 1){    
                search(h,w);
                ans += cntBlack*cntWhite;
            }
        }
    }
    cout << ans << endl;
}