Problem:
Score : 300 points

Problem Statement

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.

Sample Input 1

3 3
.#.
..#
#..

Sample Output 1

10

Some of the pairs satisfying the condition are ((1, 2), (3, 3)) and ((3, 1), (3, 2)), where (i, j) denotes the square at the i-th row from the top and the j-th column from the left.

Sample Input 2

2 4
....
....

Sample Output 2

0

Sample Input 3

4 3
###
###
...
###

Sample Output 3

6

Solution in PyPy3 (2.4.0) (judge verdict: Accepted)

h, w = map(int,input().split())
S = [input() for i in range(h)]

M = [[] for i in range(h*w)]

for i in range(h*w):
    a = i // w
    b = i % w
    for d in [[-1, 0], [1, 0], [0, -1], [0, 1]]:
        aa = d[0] + a
        bb = d[1] + b
        if 0 <= aa < h and 0 <= bb < w \
            and S[a][b] != S[aa][bb]:
            M[a*w+b].append(aa*w+bb)

# print(M)

ans = 0
V = [0] * (h*w)
D = {".":0, "#":1}
for i in range(h*w):
    if V[i] == 0:
        ANS = [0, 0]
        Q = [i]
        s = 0
        V[i] = 1
        ANS[D[S[i//w][i%w]]] += 1
        while s < len(Q):
            i = Q[s]
            for x in M[i]:
                if V[x] == 0:
                    V[x] = 1
                    ANS[D[S[x//w][x%w]]] += 1
                    Q.append(x)
            s += 1
        # print(ANS)
        ans += ANS[0] * ANS[1]
print(ans)