Problem p01349 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <bits/stdc++.h>
using namespace std;

#define fi first
#define se second
#define repl(i, a, b) for (int i = (int)(a); i < (int)(b); i++)
#define rep(i, n) repl(i, 0, n)
#define each(itr, v) for (auto itr : v)
#define pb(s) push_back(s)
#define mp(a, b) make_pair(a, b)
#define all(x) (x).begin(), (x).end()
#define dbg(x) cout << #x "=" << x << endl
#define maxch(x, y) x = max(x, y)
#define minch(x, y) x = min(x, y)
#define uni(x) x.erase(unique(all(x)), x.end())
#define exist(x, y) (find(all(x), y) != x.end())
#define bcnt(x) bitset<32>(x).count()

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> P;
typedef pair<P, int> PPI;
typedef pair<ll, ll> PL;
typedef pair<P, ll> PPL;

#define INF INT_MAX / 3

#define MAX_N 1000

int h, w, n;
char board[33][33];
char tmp[33][33];
bool check[33][33];

int dd[] = {-1, 0, 1, 0, -1};

bool is_ok() {
  rep(j, w) {
    for (int i = h - 1; i > 0; i--)
      rep(ii, i) {
        if (tmp[ii][j] != '.' && tmp[ii + 1][j] == '.')
          swap(tmp[ii][j], tmp[ii + 1][j]);
      }
  }
  while (1) {
    memset(check, 0, sizeof(check));
    bool update = false;
    rep(i, h) rep(j, w) {
      if (tmp[i][j] == '.')
        continue;
      rep(d, 4) {
        int ni = i + dd[d], nj = j + dd[d + 1];
        int cnt = 1;
        while (ni >= 0 && ni < h && nj >= 0 && nj < w &&
               tmp[i][j] == tmp[ni][nj]) {
          ni += dd[d], nj += dd[d + 1];
          cnt++;
        }
        if (cnt >= n) {
          update = true;
          int nni = i, nnj = j;
          while (nni >= 0 && nni < h && nnj >= 0 && nnj < w &&
                 tmp[i][j] == tmp[nni][nnj]) {
            check[nni][nnj] = true;
            nni += dd[d], nnj += dd[d + 1];
          }
        }
      }
    }
    if (!update)
      break;
    rep(i, h) rep(j, w) {
      if (check[i][j])
        tmp[i][j] = '.';
    }
    rep(j, w) {
      for (int i = h - 1; i > 0; i--)
        rep(ii, i) {
          if (tmp[ii][j] != '.' && tmp[ii + 1][j] == '.')
            swap(tmp[ii][j], tmp[ii + 1][j]);
        }
    }
  }
  rep(i, h) rep(j, w) {
    if (tmp[i][j] != '.')
      return false;
  }
  return true;
}

int main() {
  cin.sync_with_stdio(false);
  cin >> h >> w >> n;
  rep(i, h) cin >> board[i];
  bool ok = false;
  rep(i, h) rep(j, w - 1) {
    memcpy(tmp, board, sizeof(board));
    swap(tmp[i][j], tmp[i][j + 1]);
    if (is_ok()) {
      ok = true;
    }
  }
  if (ok)
    cout << "YES" << endl;
  else
    cout << "NO" << endl;
  return 0;
}

Error: TLE

Fixed submission:

#include <bits/stdc++.h>
using namespace std;

#define fi first
#define se second
#define repl(i, a, b) for (int i = (int)(a); i < (int)(b); i++)
#define rep(i, n) repl(i, 0, n)
#define each(itr, v) for (auto itr : v)
#define pb(s) push_back(s)
#define mp(a, b) make_pair(a, b)
#define all(x) (x).begin(), (x).end()
#define dbg(x) cout << #x "=" << x << endl
#define maxch(x, y) x = max(x, y)
#define minch(x, y) x = min(x, y)
#define uni(x) x.erase(unique(all(x)), x.end())
#define exist(x, y) (find(all(x), y) != x.end())
#define bcnt(x) bitset<32>(x).count()

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> P;
typedef pair<P, int> PPI;
typedef pair<ll, ll> PL;
typedef pair<P, ll> PPL;

#define INF INT_MAX / 3

#define MAX_N 1000

int h, w, n;
char board[33][33];
char tmp[33][33];
bool check[33][33];

int dd[] = {-1, 0, 1, 0, -1};

bool is_ok() {
  while (1) {
    memset(check, 0, sizeof(check));
    bool update = false;
    rep(i, h) rep(j, w) {
      if (tmp[i][j] == '.')
        continue;
      rep(d, 4) {
        int ni = i + dd[d], nj = j + dd[d + 1];
        int cnt = 1;
        while (ni >= 0 && ni < h && nj >= 0 && nj < w &&
               tmp[i][j] == tmp[ni][nj]) {
          ni += dd[d], nj += dd[d + 1];
          cnt++;
        }
        if (cnt >= n) {
          update = true;
          int nni = i, nnj = j;
          while (ni >= 0 && ni < h && nj >= 0 && nj < w &&
                 tmp[i][j] == tmp[nni][nnj]) {
            check[nni][nnj] = true;
            nni += dd[d], nnj += dd[d + 1];
          }
        }
      }
    }
    if (!update)
      break;
    rep(i, h) rep(j, w) {
      if (check[i][j])
        tmp[i][j] = '.';
    }
    rep(j, w) {
      for (int i = h - 1; i > 0; i--)
        rep(ii, i) {
          if (tmp[ii][j] != '.' && tmp[ii + 1][j] == '.')
            swap(tmp[ii][j], tmp[ii + 1][j]);
        }
    }
  }
  rep(i, h) rep(j, w) {
    if (tmp[i][j] != '.')
      return false;
  }
  return true;
}

int main() {
  cin.sync_with_stdio(false);
  cin >> h >> w >> n;
  rep(i, h) cin >> board[i];
  bool ok = false;
  rep(i, h) rep(j, w - 1) {
    if (board[i][j] != '.' && board[i][j + 1] != '.') {
      memcpy(tmp, board, sizeof(board));
      swap(tmp[i][j], tmp[i][j + 1]);
      if (is_ok()) {
        ok = true;
      }
    }
  }
  if (ok)
    cout << "YES" << endl;
  else
    cout << "NO" << endl;
  return 0;
}