Problem p03157 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> iint;
typedef pair<ll, ll> llll;
#define ALL(x) (x).begin(), (x).end()
const ll zero = 0;
const ll INF = 3000000000000000000; // 10^18
const int inINF = 1000000000;       // 10^9
const ll MOD = 1000000007;          // 10^9+7
const ll MOD2 = 998244353;

int black, white;
void dfs(vector<vector<char>> S, vector<vector<int>> &used, int sh, int sw,
         int H, int W) {
  used[sh][sw] = 1;
  if ((sh + sw) % 2 == 1) {
    black++;
  } else {
    white++;
  }
  if (sh < H - 1 && used[sh + 1][sw] == 0 && S[sh + 1][sw] == S[sh][sw]) {
    dfs(S, used, sh + 1, sw, H, W);
  }
  if (sh > 0 && used[sh - 1][sw] == 0 && S[sh - 1][sw] == S[sh][sw]) {
    dfs(S, used, sh - 1, sw, H, W);
  }
  if (sw < W - 1 && used[sh][sw + 1] == 0 && S[sh][sw + 1] == S[sh][sw]) {
    dfs(S, used, sh, sw + 1, H, W);
  }
  if (sw > 0 && used[sh][sw - 1] == 0 && S[sh][sw - 1] == S[sh][sw]) {
    dfs(S, used, sh, sw - 1, H, W);
  }
}

int main() {
  int H, W;
  cin >> H >> W;
  vector<vector<char>> S(H, vector<char>(W));
  for (int i = 0; i < H; i++) {
    for (int j = 0; j < W; j++) {
      cin >> S[i][j];
    }
  }
  for (int i = 0; i < H; i++) {
    for (int j = 0; j < W; j++) {
      if ((i + j) % 2 == 0) {
        if (S[i][j] == '.') {
          S[i][j] = '#';
        } else {
          S[i][j] = '.';
        }
      }
    }
  }

  vector<vector<int>> used(H, vector<int>(W, 0));
  bool check = true;
  ll ans = 0;

  for (int i = 0; i < H; i++) {
    for (int j = 0; j < W; j++) {
      if (used[i][j] == 1)
        continue;
      black = 0;
      white = 0;
      dfs(S, used, i, j, H, W);
      ans += black * white;
    }
  }

  printf("%lld\n", ans);
}

Fixed submission:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> iint;
typedef pair<ll, ll> llll;
#define ALL(x) (x).begin(), (x).end()
const ll zero = 0;
const ll INF = 3000000000000000000; // 10^18
const int inINF = 1000000000;       // 10^9
const ll MOD = 1000000007;          // 10^9+7
const ll MOD2 = 998244353;

ll black, white;
void dfs(vector<vector<char>> &S, vector<vector<int>> &used, int sh, int sw,
         int H, int W) {
  used[sh][sw] = 1;
  if ((sh + sw) % 2 == 1) {
    black++;
  } else {
    white++;
  }
  if (sh < H - 1 && used[sh + 1][sw] == 0 && S[sh + 1][sw] == S[sh][sw]) {
    dfs(S, used, sh + 1, sw, H, W);
  }
  if (sh > 0 && used[sh - 1][sw] == 0 && S[sh - 1][sw] == S[sh][sw]) {
    dfs(S, used, sh - 1, sw, H, W);
  }
  if (sw < W - 1 && used[sh][sw + 1] == 0 && S[sh][sw + 1] == S[sh][sw]) {
    dfs(S, used, sh, sw + 1, H, W);
  }
  if (sw > 0 && used[sh][sw - 1] == 0 && S[sh][sw - 1] == S[sh][sw]) {
    dfs(S, used, sh, sw - 1, H, W);
  }
}

int main() {
  int H, W;
  cin >> H >> W;
  vector<vector<char>> S(H, vector<char>(W));
  for (int i = 0; i < H; i++) {
    for (int j = 0; j < W; j++) {
      cin >> S[i][j];
    }
  }
  for (int i = 0; i < H; i++) {
    for (int j = 0; j < W; j++) {
      if ((i + j) % 2 == 0) {
        if (S[i][j] == '.') {
          S[i][j] = '#';
        } else {
          S[i][j] = '.';
        }
      }
    }
  }

  vector<vector<int>> used(H, vector<int>(W, 0));
  bool check = true;
  ll ans = 0;

  for (int i = 0; i < H; i++) {
    for (int j = 0; j < W; j++) {
      if (used[i][j] == 1)
        continue;
      black = 0;
      white = 0;
      dfs(S, used, i, j, H, W);
      ans += black * white;
    }
  }

  printf("%lld\n", ans);
}