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

#include <bits/stdc++.h>
using namespace std;

void solve(int n) {
  int d;
  cin >> d;
  vector<string> name(n);
  for (int i = 0; i < n; i++)
    cin >> name[i];

  auto trans = [&](string s) {
    set<string> resp;
    // insert
    for (int i = 0; i <= s.size(); i++) {
      for (int k = 0; k <= 'z' - 'a'; k++) {
        char x = 'a' + k;
        string tmp = s.substr(0, i) + x + s.substr(i);
        resp.insert(tmp);
      }
    }
    // delete
    for (int i = 0; i < s.size(); i++) {
      string tmp = s.substr(0, i) + s.substr(i + 1);
      resp.insert(tmp);
    }
    // replace
    for (int i = 0; i < s.size(); i++) {
      for (int k = 0; k <= 'z' - 'a'; k++) {
        char x = 'a' + k;
        string tmp = s.substr(0, i) + x + s.substr(i + 1);
        resp.insert(tmp);
      }
    }
    // swap
    for (int i = 0; i + 1 < s.size(); i++) {
      string tmp = s;
      swap(tmp[i], tmp[i + 1]);
      resp.insert(tmp);
    }
    return resp;
  };
  vector<set<string>> ss(n);
  for (int i = 0; i < n; i++) {
    ss[i] = trans(name[i]);
  }
  set<pair<string, string>> res;
  if (d == 1) {
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < i; j++) {
        if (ss[j].count(name[i])) {
          res.insert({min(name[i], name[j]), max(name[i], name[j])});
        }
      }
    }
  } else {
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < i; j++) {
        for (auto &str : ss[i]) {
          if (ss[j].count(str)) {
            res.insert({min(name[i], name[j]), max(name[i], name[j])});
            break;
          }
        }
      }
    }
  }
  for (auto p : res)
    cout << p.first << "," << p.second << endl;
  cout << res.size() << endl;
}
int main() {
  int n;
  while (cin >> n, n) {
    solve(n);
  }
  return 0;
}


Error: TLE

Fixed submission:

#include <bits/stdc++.h>
using namespace std;

void solve(int n) {
  int d;
  cin >> d;
  vector<string> name(n);
  for (int i = 0; i < n; i++)
    cin >> name[i];
  vector<pair<string, string>> res;
  auto check = [&](int i) {
    vector<string> strs;
    function<void(string, int)> dfs = [&](string s, int cnt) {
      if (cnt == 0) {
        strs.push_back(s);
        return;
      }
      // insert
      for (int i = 0; i <= s.size(); i++) {
        for (int k = 0; k <= 'z' - 'a'; k++) {
          char x = 'a' + k;
          string tmp = s.substr(0, i) + x + s.substr(i);
          dfs(tmp, cnt - 1);
        }
      }
      // delete
      for (int i = 0; i < s.size(); i++) {
        string tmp = s.substr(0, i) + s.substr(i + 1);
        dfs(tmp, cnt - 1);
      }
      // replace
      for (int i = 0; i < s.size(); i++) {
        for (int k = 0; k <= 'z' - 'a'; k++) {
          char x = 'a' + k;
          string tmp = s.substr(0, i) + x + s.substr(i + 1);
          dfs(tmp, cnt - 1);
        }
      }
      // swap
      for (int i = 0; i + 1 < s.size(); i++) {
        string tmp = s;
        swap(tmp[i], tmp[i + 1]);
        dfs(tmp, cnt - 1);
      }
    };
    dfs(name[i], d);
    vector<int> isok(i, false);
    for (int j = 0; j < i; j++) {
      for (auto str : strs) {
        if (str == name[j])
          isok[j] = true;
      }
    }
    for (int j = 0; j < i; j++)
      if (isok[j])
        res.push_back({min(name[i], name[j]), max(name[i], name[j])});
  };
  for (int i = 0; i < n; i++) {
    check(i);
  }
  sort(res.begin(), res.end());
  for (int i = 0; i < res.size(); i++) {
    cout << res[i].first << "," << res[i].second << endl;
  }
  cout << res.size() << endl;
}
int main() {
  int n;
  while (cin >> n, n) {
    solve(n);
  }
  return 0;
}