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 Go (1.6) (judge verdict: Time Limit Exceeded)

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
)

var sc = bufio.NewScanner(os.Stdin)

func Scanner() string {
	sc.Scan()
	return sc.Text()
}

func intScanner() int {
	n, _ := strconv.Atoi(Scanner())
	return n
}

func floatScanner() float64 {
	n, _ := strconv.ParseFloat(Scanner(), 64)
	return n
}
func stringToInt(s string) int {
	n, _ := strconv.Atoi(s)
	return n
}
func stringSliceScanner(n int) []string {
	a := make([]string, n)
	for i := 0; i < n; i++ {
		a[i] = Scanner()
	}
	return a
}
func intSliceScanner(n int) []int {
	a := make([]int, n)
	for i := 0; i < n; i++ {
		a[i] = intScanner()
	}
	return a
}
func larger(a, b int) int {
	if a < b {
		return b
	} else {
		return a
	}
}
func smaller(a, b int) int {
	if a > b {
		return b
	} else {
		return a
	}
}
func max(a []int) int {
	x := a[0]
	for i := 0; i < len(a); i++ {
		if x < a[i] {
			x = a[i]
		}
	}
	return x
}
func min(a []int) int {
	x := a[0]
	for i := 0; i < len(a); i++ {
		if x > a[i] {
			x = a[i]
		}
	}
	return x
}

var mod int

func main() {
	mod = 1000000007
	buf := make([]byte, 0)
	sc.Buffer(buf, mod)
	sc.Split(bufio.ScanWords)
	h, w := intScanner(), intScanner()
	s := make([]string, h)
	for i := 0; i < h; i++ {
		s[i] = Scanner()
	}
	g := make([][]int, h*w)
	for i := 0; i < h; i++ {
		for j := 0; j < w; j++ {
			if i+1 < h {
				if s[i][j] != s[i+1][j] {
					g[i*w+j] = append(g[i*w+j], i*w+j+w)
				}
			}
			if i-1 >= 0 {
				if s[i][j] != s[i-1][j] {
					g[i*w+j] = append(g[i*w+j], i*w+j-w)
				}
			}
			if j+1 < w {
				if s[i][j] != s[i][j+1] {
					g[i*w+j] = append(g[i*w+j], i*w+j+1)
				}
			}
			if j-1 >= 0 {
				if s[i][j] != s[i][j-1] {
					g[i*w+j] = append(g[i*w+j], i*w+j-1)
				}
			}
		}
	}
	t := make([]int, h*w)
	for i := 0; i < h*w; i++ {
		t[i] = -1
	}
	for i := 0; i < h*w; i++ {
		if t[i] == -1 {
			q := []int{i}
			for len(q) != 0 {
				y := q[0]
				q = q[1:]
				t[y] = i
				for _, v := range g[y] {
					if t[v] == -1 {
						q = append(q, v)
					}
				}
			}
		}
	}
	bs := make(map[int]int)
	ws := make(map[int]int)
	for i, v := range t {
		if string(s[i/w][i%w]) == "#" {
			bs[v]++
		} else {
			ws[v]++
		}
	}
	ans := 0
	for k, v := range bs {
		ans += ws[k] * v
	}
	fmt.Println(ans)
}