Problem p01127 (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 repr(i, n) for (int i = (int)(n - 1); i >= 0; i--)
#define rep(i, n) repl(i, 0, n)
#define each(itr, v) for (auto itr : v)
#define pb(s) push_back(s)
#define all(x) (x).begin(), (x).end()
#define dbg(x) cout << #x " = " << x << endl
#define print(x) cout << 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, P> PP;
typedef pair<P, int> PPI;
typedef pair<int, P> PIP;
typedef pair<ll, ll> PL;
typedef pair<P, ll> PPL;
typedef set<int> S;

#define INF INT_MAX / 3
#define MAX_N 1000000001

int h, w;
vector<string> s(50);
vector<PP> v(26);
vector<char> vc;

bool ok() {
  char tmp[h][w];
  rep(i, h) rep(j, w) tmp[i][j] = '.';

  rep(i, vc.size()) {
    repl(j, v[vc[i] - 'A'].se.fi, v[vc[i] - 'A'].se.se + 1) {
      repl(k, v[vc[i] - 'A'].fi.fi, v[vc[i] - 'A'].fi.se + 1) {
        tmp[j][k] = vc[i];
      }
    }
  }

  rep(i, h) rep(j, w) if (s[i][j] != tmp[i][j]) return false;
  return true;
}

int main() {
  cin.sync_with_stdio(false);
  int t;
  cin >> t;
  rep(ii, t) {
    cin >> h >> w;
    rep(i, h) cin >> s[i];

    vc.clear();
    rep(i, 26) v[i] = PP(P(INF, 0), P(INF, 0));
    rep(i, h) rep(j, w) {
      if (s[i][j] != '.') {
        minch(v[s[i][j] - 'A'].fi.fi, j), maxch(v[s[i][j] - 'A'].fi.se, j);
        minch(v[s[i][j] - 'A'].se.fi, i), maxch(v[s[i][j] - 'A'].se.se, i);
        vc.pb(s[i][j]);
      }
    }

    sort(all(vc));
    uni(vc);
    bool ans = false;
    do {
      if (ok()) {
        ans = true;
        break;
      }
    } while (next_permutation(all(vc)));

    cout << ((ans) ? "SAFE" : "SUSPICIOUS") << 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 repr(i, n) for (int i = (int)(n - 1); i >= 0; i--)
#define rep(i, n) repl(i, 0, n)
#define each(itr, v) for (auto itr : v)
#define pb(s) push_back(s)
#define all(x) (x).begin(), (x).end()
#define dbg(x) cout << #x " = " << x << endl
#define print(x) cout << 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, P> PP;
typedef pair<P, int> PPI;
typedef pair<int, P> PIP;
typedef pair<ll, ll> PL;
typedef pair<P, ll> PPL;
typedef set<int> S;

#define INF INT_MAX / 3
#define MAX_N 1000000001

int h, w;
bool rectangle;
vector<string> s(50);
vector<PP> v(50);
vector<char> vc;
int dd[] = {0, 1, 0, -1, 0};
bool visited[50][50];

bool range(int x, int y) { return 0 <= x && x < w && 0 <= y && y < h; }

void wfs(int y, int x, char c) {
  deque<P> q;
  q.pb(P(y, x));
  visited[y][x] = true;

  int minx = INF, maxx = 0, miny = INF, maxy = 0;
  while (!q.empty()) {
    P p = q.front();
    q.pop_front();
    minch(minx, p.se), maxch(maxx, p.se);
    minch(miny, p.fi), maxch(maxy, p.fi);

    rep(i, 4) {
      int xx = p.se + dd[i], yy = p.fi + dd[i + 1];
      if (range(xx, yy) && s[yy][xx] == c && !visited[yy][xx]) {
        q.pb(P(yy, xx));
        visited[yy][xx] = true;
      }
    }
  }

  v[c - 'A'] = PP(P(minx, maxx), P(miny, maxy));
  vc.pb(c);
}

bool ok() {
  char tmp[h][w];
  rep(i, h) rep(j, w) tmp[i][j] = '.';

  rep(i, vc.size()) {
    repl(j, v[vc[i] - 'A'].se.fi, v[vc[i] - 'A'].se.se + 1) {
      repl(k, v[vc[i] - 'A'].fi.fi, v[vc[i] - 'A'].fi.se + 1) {
        tmp[j][k] = vc[i];
      }
    }
  }

  rep(i, h) rep(j, w) if (s[i][j] != tmp[i][j]) return false;
  return true;
}

int main() {
  cin.sync_with_stdio(false);
  int t;
  cin >> t;
  rep(ii, t) {
    vc.clear();
    cin >> h >> w;
    rep(i, h) cin >> s[i];

    rectangle = false;
    rep(i, h) rep(j, w) visited[i][j] = false;
    rep(i, h) rep(j, w) {
      if (s[i][j] != '.' && !visited[i][j])
        wfs(i, j, s[i][j]);
    }

    sort(all(vc));
    bool ans = false;
    do {
      if (ok()) {
        ans = true;
        break;
      }
    } while (next_permutation(all(vc)));

    cout << ((ans) ? "SAFE" : "SUSPICIOUS") << endl;
  }

  return 0;
}