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

#include <algorithm>
#include <bitset>
#include <cassert>
#include <cctype>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <utility>
#include <vector>
using namespace std;
typedef long long ll;
const double EPS = 1e-9;
typedef vector<int> vint;
typedef pair<int, int> pint;
#define rep(i, n) REP(i, 0, n)
#define ALL(v) v.begin(), v.end()
#define MSG(a) cout << #a << " " << a << endl;
#define REP(i, x, n) for (i = x; i < n; i++)
template <class T> T RoundOff(T a) { return int(a + .5 - (a < 0)); }
template <class T, class C> void chmax(T &a, C b) {
  if (a < b)
    a = b;
}
template <class T, class C> void chmin(T &a, C b) {
  if (b < a)
    a = b;
}
template <class T, class C> pair<T, C> mp(T a, C b) { return make_pair(a, b); }

int main() {
  int n;

  while (cin >> n && n) {
    vector<string> field(n + 1);
    vector<vint> table(n + 1, vint(n + 1));
    int x, y, i, lim;

    field[0] = "*";
    rep(x, n) field[0] += "*";

    for (y = 1; y <= n; y++) {
      string line;
      cin >> line;
      field[y] = "*" + line;
    }

    for (y = 0; y <= n; y++)
      for (x = 0; x <= n; x++) {
        if (y == 0 && x == 0)
          table[y][x] = field[y][x] == '*';
        else if (y == 0)
          table[y][x] = table[y][x - 1] + (field[y][x] == '*');
        else if (x == 0)
          table[y][x] = table[y - 1][x] + (field[y][x] == '*');
        else
          table[y][x] = table[y][x - 1] + table[y - 1][x] -
                        table[y - 1][x - 1] + (field[y][x] == '*');
      }

    int res = 0;
    for (y = 0; y <= n; y++) {
      for (x = 0; x <= n; x++) {
        lim = min(n - y, n - x) + 1;
        REP(i, 1, lim) {
          if (table[y + i][x + i] - table[y][x + i] - table[y + i][x] +
                  table[y][x] ==
              0) {
            chmax(res, i);
          } else
            break;
        }
      }
    }

    cout << res << endl;
  }
}

Error: TLE

Fixed submission:


#include <algorithm>
#include <bitset>
#include <cassert>
#include <cctype>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <utility>
#include <vector>
using namespace std;
typedef long long ll;
const double EPS = 1e-9;
typedef vector<int> vint;
typedef pair<int, int> pint;
#define rep(i, n) REP(i, 0, n)
#define ALL(v) v.begin(), v.end()
#define MSG(a) cout << #a << " " << a << endl;
#define REP(i, x, n) for (int i = x; i < n; i++)
template <class T> T RoundOff(T a) { return int(a + .5 - (a < 0)); }
template <class T, class C> void chmax(T &a, C b) {
  if (a < b)
    a = b;
}
template <class T, class C> void chmin(T &a, C b) {
  if (b < a)
    a = b;
}
template <class T, class C> pair<T, C> mp(T a, C b) { return make_pair(a, b); }

int main() {
  int n;

  while (cin >> n && n) {
    vector<string> field(n);
    vector<vint> table(n, vint(n));

    rep(y, n) cin >> field[y];

    rep(y, n) rep(x, n) {
      if (y == 0 && x == 0)
        table[y][x] = field[y][x] == '*';
      else if (y == 0)
        table[y][x] = table[y][x - 1] + (field[y][x] == '*');
      else if (x == 0)
        table[y][x] = table[y - 1][x] + (field[y][x] == '*');
      else
        table[y][x] = table[y][x - 1] + table[y - 1][x] - table[y - 1][x - 1] +
                      (field[y][x] == '*');
    }

    int res = 0;
    rep(y, n) rep(x, n) rep(i, min(n - y, n - x)) {
      if (table[y + i][x + i] - table[y][x + i] - table[y + i][x] +
              table[x][y] ==
          0) {
        chmax(res, i);
        if (n / 2 < i)
          break;
      }
    }

    cout << res << endl;
  }
}