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

#include <bits/stdc++.h>
#define SIZE 300005
#define MOD 1000000007LL
#define INF 1 << 30
#define LLINF 1LL << 60
#define REP(i, n) for (int i = 0; i < n; i++)
#define FOR(i, a, b) for (int i = a; i <= b; i++)
#define DOWN(i, b, a) for (int i = b; i >= a; i--)
#define SET(a, c) memset(a, c, sizeof a)
#define FORALL(i, c)                                                           \\
  for (__typeof((c).begin()) i = (c).begin(); i != (c).end(); ++i)
#define FOREACH(i, c) for (auto(i) : (c))
#define BIT(i, j) ((i) >> (j)) & 1
#define ALL(o) (o).begin(), (o).end()
#define ERASE(o) (o).erase(unique((o).begin(), (o).end()), (o).end())
#define SQ(x) ((x) * (x))
using namespace std;
typedef long long ll;
typedef pair<ll, ll> Pll;
typedef pair<int, int> Pii;
typedef pair<double, double> Pdd;
typedef complex<double> dcomplex;
template <typename T> inline void priv(vector<T> a) {
  REP(i, a.size()) { cerr << a[i] << ((i == a.size() - 1) ? "\\n" : " "); }
}
ll gcd(ll a, ll b) {
  int c = max(a, b);
  int d = min(a, b);
  return c == 0 || d == 0 ? c : gcd(c % d, d);
}
ll lcm(ll a, ll b) { return a == 0 || b == 0 ? 0 : a * b / gcd(a, b); }
ll fact(ll a) {
  ll b = 1;
  FOR(i, 1, a) b *= i;
  return b;
}

int main() {
  string s;
  int n;
  while (cin >> n, n) {
    vector<int> dp(n * n, 0);
    REP(i, n) {
      cin >> s;
      REP(j, n) if (s[j] == '.') dp[i * n + j] = 1;
    }
    FOR(i, 1, n - 1)
    FOR(j, 1, n - 1) if (dp[i * n + j]) dp[i * n + j] =
        min({dp[(i - 1) * n + j], dp[(i - 1) * n + (j - 1)],
             dp[i * n + (j - 1)]}) +
        1;
    cout << *max_element(dp.begin(), dp.end()) << endl;
  }
  return 0;
}

Error: TLE

Fixed submission:

#include <bits/stdc++.h>
#define SIZE 300005
#define MOD 1000000007LL
#define INF 1 << 30
#define LLINF 1LL << 60
#define REP(i, n) for (int i = 0; i < n; i++)
#define FOR(i, a, b) for (int i = a; i <= b; i++)
#define DOWN(i, b, a) for (int i = b; i >= a; i--)
#define SET(a, c) memset(a, c, sizeof a)
#define FORALL(i, c)                                                           \\
  for (__typeof((c).begin()) i = (c).begin(); i != (c).end(); ++i)
#define FOREACH(i, c) for (auto(i) : (c))
#define BIT(i, j) ((i) >> (j)) & 1
#define ALL(o) (o).begin(), (o).end()
#define ERASE(o) (o).erase(unique((o).begin(), (o).end()), (o).end())
#define SQ(x) ((x) * (x))
using namespace std;
typedef long long ll;
typedef pair<ll, ll> Pll;
typedef pair<int, int> Pii;
typedef pair<double, double> Pdd;
typedef complex<double> dcomplex;
template <typename T> inline void priv(vector<T> a) {
  REP(i, a.size()) { cerr << a[i] << ((i == a.size() - 1) ? "\\n" : " "); }
}
ll gcd(ll a, ll b) {
  int c = max(a, b);
  int d = min(a, b);
  return c == 0 || d == 0 ? c : gcd(c % d, d);
}
ll lcm(ll a, ll b) { return a == 0 || b == 0 ? 0 : a * b / gcd(a, b); }
ll fact(ll a) {
  ll b = 1;
  FOR(i, 1, a) b *= i;
  return b;
}

int main() {
  string s;
  int n;
  while (cin >> n, n) {
    vector<vector<bool>> a(n, vector<bool>(n, false));
    REP(i, n) {
      cin >> s;
      REP(j, n) if (s[j] == '.') a[i][j] = true;
    }
    auto b(a);
    int ans = 0;
    REP(i, n) REP(j, n) if (b[i][j]) {
      int d = 1;
      bool f = true, g = true;
      while (i + d < n && j + d < n) {
        REP(k, d + 1) if (!(a[i + d][j + k] && a[i + k][j + d])) {
          f = false;
          break;
        }
        if (!f) {
          g = !a[i + d][j + d] || !a[i + d - 1][j + d] || !a[i + d][j + d - 1];
          break;
        }
        d++;
      }
      if (g)
        REP(k, d) b[i + k][j + k] = false;
      ans = max(ans, d);
    }
    cout << ans << endl;
  }
  return 0;
}