output_description: Print the answer.
  
  * * *
input_description: Input is given from Standard Input in the following format:
  
      
      
      H W
      S_1
      S_2
      :
      S_H
attempt: import sys
  
  stdin = sys.stdin
  
  sys.setrecursionlimit(10**5)
  
  
  def li():
      return map(int, stdin.readline().split())
  
  
  def li_():
      return map(lambda x: int(x) - 1, stdin.readline().split())
  
  
  def lf():
      return map(float, stdin.readline().split())
  
  
  def ls():
      return stdin.readline().split()
  
  
  def ns():
      return stdin.readline().rstrip()
  
  
  def lc():
      return list(ns())
  
  
  def ni():
      return int(stdin.readline())
  
  
  def nf():
      return float(stdin.readline())
  
  
  h, w = li()
  inp = [lc() for _ in range(h)]
  grid = [[-1] * w for _ in range(h)]
  for i, row in enumerate(inp):
      for j, col in enumerate(row):
          if inp[i][j] == ".":
              grid[i][j] = 0
          else:
              grid[i][j] = 1
  
  dis = [-1, 0, 1, 0]
  djs = [0, -1, 0, 1]
  hasVisited = [[False] * w for _ in range(h)]
  
  
  def dfs(sti, stj, h, w):
      stack = [(sti, stj)]
      cnt_white = 0
      cnt_black = 0
      while stack:
          i, j = stack.pop()
          for di, dj in zip(dis, djs):
              if 0 <= i + di < h and 0 <= j + dj < w:
                  if (not hasVisited[i + di][j + dj]) and (
                      grid[i + di][j + dj] != grid[i][j]
                  ):
                      hasVisited[i + di][j + dj] = True
                      if grid[i + di][j + dj] == 0:
                          cnt_white += 1
                      else:
                          cnt_black += 1
                      stack.append((i + di, j + dj))
  
      return cnt_white * cnt_black
  
  
  ans = 0
  for r in range(h):
      for c in range(w):
          if hasVisited[r][c]:
              continue
  
          cnt = dfs(r, c, h, w)
          ans += cnt
  
  print(ans)
  
problem_description: 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...
samples: [{"input": "3 3\n    .#.\n    ..#\n    #..", "output": "10\n    \n\nSome of the pairs satisfying the condition are ((1, 2), (3, 3)) and ((3, 1),\n(3, 2)), where (i, j) denotes the square at the i-th row from the top and the\nj-th column from the left.\n\n* * *"}, {"input": "2 4\n    ....\n    ....", "output": "0\n    \n\n* * *"}, {"input": "4 3\n    ###\n    ###\n    ...\n    ###", "output": "6"}]