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<iostream>
#include<queue>
using namespace std;
int h,w;
int sz,used[444][444];
long ans;
string s[444];
int dx[]={0,1,0,-1},dy[]={1,0,-1,0};
int main()
{
	cin>>h>>w;
	for(int i=0;i<h;i++)cin>>s[i];
	for(int i=0;i<h;i++)
	{
		for(int j=0;j<w;j++)
		{
			if(used[i][j])continue;
			sz++;
			queue<pair<pair<int,int>,bool> >P;
			P.push(make_pair(make_pair(i,j),s[i][j]=='#'));
			used[i][j]=sz;
			long cw=0,cb=0;
			(s[i][j]=='.'?cb:cw)++;
			while(!P.empty())
			{
				int x=P.front().first.first,y=P.front().first.second;
				bool b=P.front().second;
				P.pop();
				for(int r=0;r<4;r++)
				{
					int tx=x+dx[r],ty=y+dy[r];
					if(tx<0||ty<0||tx>=h||ty>=w||used[tx][ty]||(b==(s[tx][ty]=='#')))continue;
					(b?cb:cw)++;
					used[tx][ty]=sz;
					P.push(make_pair(make_pair(tx,ty),!b));
				}
			}
			ans+=cb*cw;
		}
	}
	cout<<ans<<endl;
}