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 PHP (7.4.4) (judge verdict: Accepted)

<?php
list($h, $w) = ints();
for ($i = 0; $i < $h; ++$i) list($s[]) = strs();
for ($i = 0; $i < $h; ++$i) {
    for ($j = 0; $j < $w; ++$j) {
        if ($i < $h - 1 && $s[$i][$j] !== $s[$i + 1][$j]) {
            $g[$i][$j][] = [$i + 1, $j];
            $g[$i + 1][$j][] = [$i, $j];
        }
        if ($j < $w - 1 && $s[$i][$j] !== $s[$i][$j + 1]) {
            $g[$i][$j][] = [$i, $j + 1];
            $g[$i][$j + 1][] = [$i, $j];
        }
    }
}
$seen = array_fill(0, $h, array_fill(0, $w, false));
$ans = 0;
for ($i = 0; $i < $h; ++$i) {
    for ($j = 0; $j < $w; ++$j) {
        if (!$seen[$i][$j]) {
            list($cb, $cw) = dfs($i, $j);
            $ans += $cb * $cw;
        }
    }
}
echo $ans;
function dfs($i, $j)
{
    global $g, $seen, $s;
    $seen[$i][$j] = true;

    $res = $s[$i][$j] === '#' ? [1, 0] : [0, 1];
    if (is_null($g[$i][$j])) return $res;
    foreach ($g[$i][$j] as list($ni, $nj)) {
        if ($seen[$ni][$nj]) continue;
        list($cb, $cw) = dfs($ni, $nj);
        $res[0] += $cb;
        $res[1] += $cw;
    }
    return $res;
}

function strs()
{
    return explode(' ', trim(fgets(STDIN)));
}
function ints()
{
    return array_map('intval', explode(' ', trim(fgets(STDIN))));
}