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

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <functional>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <vector>

using namespace std;

#define rep(i, j) REP((i), 0, (j))
#define REP(i, j, k) for (int i = (j); (i) < (k); ++i)
#define BW(a, x, b) ((a) <= (x) && (x) <= (b))
#define ALL(v) (v).begin(), (v).end()
#define LENGTHOF(x) (sizeof(x) / sizeof(*(x)))
#define AFILL(a, b) fill((int *)a, (int *)(a + LENGTHOF(a)), b)
#define SQ(x) ((x) * (x))
#define Mod(x, mod) (((x)+(mod)%(mod))
#define MP make_pair
#define PB push_back
#define Fi first
#define Se second
#define INF (1 << 29)
#define EPS 1e-10
#define MOD 1000000007

typedef pair<int, int> pi;
typedef pair<int, pi> pii;
typedef vector<int> vi;
typedef queue<int> qi;
typedef long long ll;

int n;
string S[512];
vector<int> G[32];

int dfs(int p, int d) {
  if (d > 26)
    return 0;
  for (auto g : G[p]) {
    if (!dfs(g, d + 1))
      return 0;
  }
  return 1;
}

int solve() {
  rep(i, 26) G[31].push_back(i);
  rep(i, n - 1) {
    //    cout << i << endl;
    int p = 0;
    string s = S[i], t = S[i + 1];
    while (1) {
      if (s[p] == '\\0')
        break;
      if (t[p] == '\\0')
        return 0;
      if (s[p] != t[p]) {
        if (find(begin(G[s[p] - 'a']), end(G[s[p] - 'a']), t[p] - 'a') ==
            end(G[s[p] - 'a']))
          G[s[p] - 'a'].push_back(t[p] - 'a');
        break;
      }
      p++;
    }
  }
  return dfs(31, 0);
}

int main() {
  while (1) {
    cin >> n;
    if (n == 0)
      return 0;
    rep(i, 32) G[i].clear();

    rep(i, n) cin >> S[i];

    cout << (solve() ? "yes\\n" : "no\\n");
  }
  return 0;
}

Error: TLE

Fixed submission:

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <functional>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <vector>

using namespace std;

#define rep(i, j) REP((i), 0, (j))
#define REP(i, j, k) for (int i = (j); (i) < (k); ++i)
#define BW(a, x, b) ((a) <= (x) && (x) <= (b))
#define ALL(v) (v).begin(), (v).end()
#define LENGTHOF(x) (sizeof(x) / sizeof(*(x)))
#define AFILL(a, b) fill((int *)a, (int *)(a + LENGTHOF(a)), b)
#define SQ(x) ((x) * (x))
#define Mod(x, mod) (((x)+(mod)%(mod))
#define MP make_pair
#define PB push_back
#define Fi first
#define Se second
#define INF (1 << 29)
#define EPS 1e-10
#define MOD 1000000007

typedef pair<int, int> pi;
typedef pair<int, pi> pii;
typedef vector<int> vi;
typedef queue<int> qi;
typedef long long ll;

int n;
string S[512];
vector<int> G[32];

int dfs(int p, int d) {
  if (d > 26)
    return 0;
  for (auto g : G[p]) {
    if (!dfs(g, d + 1))
      return 0;
  }
  return 1;
}

int solve() {
  rep(i, 26) G[31].push_back(i);
  rep(i, n - 1) {
    //    cout << i << endl;
    int p = 0;
    string s = S[i], t = S[i + 1];
    while (1) {
      if (s[p] == '\\0')
        break;
      if (t[p] == '\\0')
        return 0;
      if (s[p] != t[p]) {
        G[s[p] - 'a'].push_back(t[p] - 'a');
        break;
      }
      p++;
    }
  }
  return dfs(31, 0);
}

int main() {
  while (1) {
    cin >> n;
    if (n == 0)
      return 0;
    rep(i, 32) G[i].clear();

    rep(i, n) cin >> S[i];

    cout << (solve() ? "Yes\\n" : "No\\n");
  }
  return 0;
}