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 C# (Mono 4.6.2.0) (judge verdict: Wrong Answer)

using System;
using System.Diagnostics;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static string[] cin = Console.ReadLine().Split();
    static int h = int.Parse(cin[0]);
    static int w = int.Parse(cin[1]);
    static bool[,] map = new bool[w, h];
    static bool[,] search = new bool[w, h];
    static int black = 0;
    static int white = 0;

    static void Main()
    {
        for (int j = 0; j < h; j++)
        {
            string s = Console.ReadLine();
            for (int i = 0; i < w; i++)
            {
                // blackのときtrue
                if (s[i] == '#') map[i, j] = true;
            }
        }

        var route = new long[w, h];
        long ans = 0;
        for (int i = 0; i < w; i++)
        {
            for (int j = 0; j < h; j++)
            {
                if (!search[i, j])
                {
                    Route(i, j);
                    ans += (black * white);
                    black = 0;
                    white = 0;
                }
            }
        }
        Console.WriteLine(ans);
    }

    static void Route(int i, int j)
    {
        search[i, j] = true;
        if (map[i, j]) black++;
        else white++;
        if (0 < j)
        {
            if (map[i, j] != map[i, j - 1])
            {
                if (!search[i, j - 1]) Route(i, j - 1);
            }
        }
        if (0 < i)
        {
            if (map[i, j] != map[i - 1, j])
            {
                if (!search[i - 1, j]) Route(i - 1, j);
            }
        }
        if (i + 1 < w)
        {
            if (map[i, j] != map[i + 1, j])
            {
                if (!search[i + 1, j]) Route(i + 1, j);
            }
        }
        if (j + 1 < h)
        {
            if (map[i, j] != map[i, j + 1])
            {
                if (!search[i, j + 1]) Route(i, j + 1);
            }
        }
    }
}