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 Haskell (GHC 7.10.3) (judge verdict: Wrong Answer)

import Control.Arrow
import Data.Bits
import Data.List
import Data.Foldable (foldlM)
import qualified Data.Vector as V
import qualified Data.Vector.Unboxed as VU
import qualified Data.Vector.Unboxed.Mutable as VM
import qualified Data.ByteString.Char8 as B
import System.IO.Unsafe

solve :: Int -> Int -> V.Vector B.ByteString -> Int
solve h w ss = VU.sum $ VU.map (\(a,b) -> a*b) $ unsafePerformIO $ VU.freeze $ VU.foldl' go count $ VU.indexed $ (\(v,eqs) -> VU.map (mapper eqs) v) label
  where
    go counter (i,n) = unsafePerformIO $ VM.modify counter (if ss !! (x,y) == '#' then first (+1) else second (+1)) n >> return counter
      where
        x = i `mod` w
        y = i `div` w

    (!!) :: V.Vector B.ByteString -> (Int, Int) -> Char
    vec !! (x,y) = (vec V.! y) `B.index` x

    (!+) :: VM.Unbox a => VM.IOVector a -> (Int, Int) -> a
    vec !+ (x,y) = unsafePerformIO $ VM.read vec (y * w + x)

    count = unsafePerformIO $ VM.replicate (w*h+1) (0,0)

    mapper :: [(Int,Int)] -> Int -> Int
    mapper [] n = n
    mapper ((a,b):eqs) n
      | n == b = a
      | otherwise = mapper eqs n

    label :: (VU.Vector Int, [(Int,Int)])
    label = (\(a,b,_) -> (unsafePerformIO $ VU.freeze a, nub b)) $ foldl' go (unsafePerformIO $ VM.replicate (w*h) 0, [], 1) [0..w*h-1]
      where
        go (visited, eqs, f) i = case length neighbors of
          0 -> (unsafePerformIO $ (VM.write visited i f >> return visited), eqs, f+1)
          1 -> (unsafePerformIO $ (VM.write visited i (head neighbors) >> return visited), eqs, f)
          _ -> (unsafePerformIO $ (VM.write visited i (head neighbors) >> return visited), map ((,) (head neighbors)) (tail neighbors), f)

          where
            x = i `mod` w
            y = i `div` w
            ch = ss !! (x,y)

            neighbors = nub
              [ visited !+ (x',y')
              | (ix,iy) <- [(1,0),(-1,0),(0,1),(0,-1)],
                let x' = x + ix, let y' = y + iy,
                0 <= x' && x' < w, 0 <= y' && y' < h,
                visited !+ (x',y') /= 0,
                ss !! (x',y') /= ch
              ]

main = do
  let readInt = fmap (second B.tail) . B.readInt

  hw <- V.unfoldrN 2 readInt <$> B.getLine
  ss <- V.replicateM (hw V.! 0) B.getLine
  print $ solve (hw V.! 0) (hw V.! 1) ss