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: from collections import deque
  
  H, W = map(int, input().split())
  S = [input().strip() for _ in range(H)]
  D = {0: ".", 1: "#"}
  G = {}
  C = {}
  hist = [[-1 for _ in range(W)] for _ in range(H)]
  col = -1
  for i in range(H):
      for j in range(W):
          if S[i][j] == "#" and hist[i][j] == -1:
              col += 1
              G[col] = [(i, j)]
              que = deque([(i, j, 1)])
              hist[i][j] = col
              cnt = 0
              while que:
                  y, x, a = que.popleft()
                  if x + 1 < W and S[y][x + 1] == D[1 - a]:
                      if a == 1 and hist[y][x + 1] != col:
                          cnt += 1
                          que.append((y, x + 1, 1 - a))
                          hist[y][x + 1] = col
                      elif a == 0 and hist[y][x + 1] == -1:
                          G[col].append((y, x + 1))
                          que.append((y, x + 1, 1 - a))
                          hist[y][x + 1] = col
                  if y - 1 > -1 and S[y - 1][x] == D[1 - a]:
                      if a == 1 and hist[y - 1][x] != col:
                          cnt += 1
                          que.append((y - 1, x, 1 - a))
                          hist[y - 1][x] = col
                      elif a == 0 and hist[y - 1][x] == -1:
                          G[col].append((y - 1, x))
                          que.append((y - 1, x, 1 - a))
                          hist[y - 1][x] = col
                  if x - 1 > -1 and S[y][x - 1] == D[1 - a]:
                      if a == 1 and hist[y][x - 1] != col:
                          cnt += 1
                          que.append((y, x - 1, 1 - a))
                          hist[y][x - 1] = col
                      elif a == 0 and hist[y][x - 1] == -1:
                          G[col].append((y, x - 1))
                          hist[y][x - 1] = col
                          que.append((y, x - 1, 1 - a))
                  if y + 1 < H and S[y + 1][x] == D[1 - a]:
                      if a == 1 and hist[y + 1][x] != col:
                          cnt += 1
                          que.append((y + 1, x, 1 - a))
                          hist[y + 1][x] = col
                      elif a == 0 and hist[y + 1][x] == -1:
                          G[col].append((y + 1, x))
                          que.append((y + 1, x, 1 - a))
                          hist[y + 1][x] = col
              C[col] = cnt
  tot = 0
  for col in G:
      tot += len(G[col]) * C[col]
  print(tot)
  
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"}]