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++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include <cstring>
#include <sstream>
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <vector>
#include <map>
#include <unordered_map>
#include <cmath>
#include <queue>
#include <set>
#include <numeric>
#include <stack>

using namespace std;
typedef long long ll;
#define rep(i, n) for(ll i = 0; i < (ll)(n); i++)
#define repr(i, n) for(ll i = n - 1; i >= 0; i--)
#define repone(i, n) for(ll i = 1; i <= (ll)(n); i++)
#define each(i, mp) for(auto i:mp)
const int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};
const ll mod = 1000000007;
const ll inf = ll(1e9);
const ll half_inf = ll(1e5);
const ll ll_inf = ll(1e9) * ll(1e9);
typedef unordered_map<char, ll> ump;
typedef pair<ll, ll> P;

vector<string> s;
bool seen[400][400];
int h, w;
ll ans = 0;

void bfs(P idx) {
    ump mp;
    mp['#'] = mp['.'] = 0;
    queue<P> que;
    char now = s[idx.first][idx.second], next = s[idx.first][idx.second];
    que.push(idx);
    seen[idx.first][idx.second] = true;
    mp[s[idx.first][idx.second]]++;

    while (!que.empty()) {
        P p = que.front();
        que.pop();
        rep(i, 4) {
            ll nx = p.first + dx[i], ny = p.second + dy[i];
            // 移動可能なマスの場合
            if (0 <= nx && nx < h && 0 <= ny && ny < w && !seen[nx][ny]) {
                if (now != s[nx][ny]) {
                    que.push(P(nx, ny));
                    mp[s[nx][ny]]++;
                    seen[nx][ny] = true;
                    next = s[nx][ny];
                }
            }
        }
        now = next;
    }
    ans += mp['#'] * mp['.'];
}

int main() {
#ifdef MY_DEBUG
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wmissing-noreturn"
    while (true) {
#pragma clang diagnostic pop
#endif
        cin >> h >> w;
        s.resize(h);
        rep(i, h) cin >> s[i];
        rep(i, h) rep(j, w) seen[i][j] = false;
        rep(i, h) {
            rep (j, w) if (!seen[i][j]) bfs(P(i, j));
        }
        cout << ans << endl;


#ifdef MY_DEBUG
    }
#endif
    return 0;
}