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

#include <bits/stdc++.h>
#define MOD 1000000007LL
using namespace std;
typedef long long ll;
typedef pair<string, string> P;

int n, d;
int ans = 0;
set<string> mp[201][18];
int cnt[201][201];
vector<P> vec;
string str[201];

void dfs(int v, string s, int nd, int uk = 0) {
  if (nd == 0) {
    mp[v][s.size()].insert(s);
    for (int i = 0; i < n; i++) {
      if (mp[i][s.size()].find(s) != mp[i][s.size()].end()) {
        cnt[v][i]++;
        cnt[i][v]++;
      }
    }
    for (int i = 0; i + 1 < s.size(); i++) {
      swap(s[i], s[i + 1]);
      dfs(v, s, nd + 1);
      swap(s[i], s[i + 1]);
    }
    for (int i = 0; i < s.size(); i++) {
      dfs(v, s.substr(0, i) + s.substr(i + 1), nd + 1);
      for (int j = 0; j < 26; j++) {
        string gu = "";
        gu += ('a' + j);
        dfs(v, s.substr(0, i) + gu + s.substr(i + 1), nd + 1, 1);
        dfs(v, s.substr(0, i) + gu + s.substr(i), nd + 1, 1);
      }
    }
    for (int i = 0; i < 26; i++) {
      string gu = "";
      gu += ('a' + i);
      dfs(v, s + gu, nd + 1);
    }
  } else if (nd == 1) {
    mp[v][s.size()].insert(s);
    if (d == 2) {
      for (int i = 0; i < n; i++) {
        if (mp[i][s.size()].find(s) != mp[i][s.size()].end()) {
          cnt[v][i]++;
          cnt[i][v]++;
        }
      }
    }
  }
}

void solve() {
  vec.clear();
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < 18; j++) {
      mp[i][j].clear();
    }
  }
  scanf("%d", &d);
  ans = 0;
  memset(cnt, 0, sizeof(cnt));
  for (int i = 0; i < n; i++) {
    cin >> str[i];
    dfs(i, str[i], 0);
  }
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < i; j++) {
      if (cnt[i][j] > 0) {
        ans++;
        vec.push_back(P(min(str[i], str[j]), max(str[i], str[j])));
      }
    }
  }
  sort(vec.begin(), vec.end());
  for (int i = 0; i < vec.size(); i++) {
    cout << vec[i].first << "," << vec[i].second << endl;
  }
  printf("%d\\n", ans);
}

int main(void) {
  while (1) {
    scanf("%d", &n);
    if (n == 0)
      break;
    solve();
  }
  return 0;
}


Error: TLE

Fixed submission:

#include <bits/stdc++.h>
#define MOD 1000000007LL
using namespace std;
typedef long long ll;
typedef pair<string, string> P;

int n, d;
int ans = 0;
set<string> mp[201][18];
int cnt[201][201];
vector<P> vec;
string str[201];

void dfs(int v, string s, int nd, int uk = 0) {
  if (nd == 0) {
    mp[v][s.size()].insert(s);
    for (int i = 0; i + 1 < s.size(); i++) {
      swap(s[i], s[i + 1]);
      dfs(v, s, nd + 1);
      swap(s[i], s[i + 1]);
    }
    for (int i = 0; i < s.size(); i++) {
      dfs(v, s.substr(0, i) + s.substr(i + 1), nd + 1);
      for (int j = 0; j < 26; j++) {
        string gu = "";
        gu += ('a' + j);
        dfs(v, s.substr(0, i) + gu + s.substr(i + 1), nd + 1, 1);
        dfs(v, s.substr(0, i) + gu + s.substr(i), nd + 1, 1);
      }
    }
    for (int i = 0; i < 26; i++) {
      string gu = "";
      gu += ('a' + i);
      dfs(v, s + gu, nd + 1);
    }
  } else if (nd == 1) {
    mp[v][s.size()].insert(s);
  }
}

void dfs2(int v, string s, int nd) {
  if (nd == 0) {
    for (int i = 0; i < n; i++) {
      if (mp[i][s.size()].find(s) != mp[i][s.size()].end()) {
        cnt[v][i]++;
        cnt[i][v]++;
      }
    }
    for (int i = 0; i + 1 < s.size(); i++) {
      swap(s[i], s[i + 1]);
      dfs2(v, s, nd + 1);
      swap(s[i], s[i + 1]);
    }
    for (int i = 0; i < s.size(); i++) {
      dfs2(v, s.substr(0, i) + s.substr(i + 1), nd + 1);
      for (int j = 0; j < 26; j++) {
        string gu = "";
        gu += ('a' + j);
        dfs2(v, s.substr(0, i) + gu + s.substr(i + 1), nd + 1);
        dfs2(v, s.substr(0, i) + gu + s.substr(i), nd + 1);
      }
    }
    for (int i = 0; i < 26; i++) {
      string gu = "";
      gu += ('a' + i);
      dfs2(v, s + gu, nd + 1);
    }
  } else if (nd == 1) {
    if (d == 2) {
      for (int i = 0; i < n; i++) {
        if (mp[i][s.size()].find(s) != mp[i][s.size()].end()) {
          cnt[v][i]++;
          cnt[i][v]++;
        }
      }
    }
  }
}

void solve() {
  vec.clear();
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < 18; j++) {
      mp[i][j].clear();
    }
  }
  scanf("%d", &d);
  ans = 0;
  memset(cnt, 0, sizeof(cnt));
  for (int i = 0; i < n; i++) {
    cin >> str[i];
    dfs(i, str[i], 0);
  }
  for (int i = 0; i < n; i++) {
    dfs2(i, str[i], 0);
  }
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < i; j++) {
      if (cnt[i][j] > 0) {
        ans++;
        vec.push_back(P(min(str[i], str[j]), max(str[i], str[j])));
      }
    }
  }
  sort(vec.begin(), vec.end());
  for (int i = 0; i < vec.size(); i++) {
    cout << vec[i].first << "," << vec[i].second << endl;
  }
  printf("%d\\n", ans);
}

int main(void) {
  while (1) {
    scanf("%d", &n);
    if (n == 0)
      break;
    solve();
  }
  return 0;
}