Problem p00776 (C++)

Buggy submission (status: Memory Limit Exceeded):
// tsukasa_diary's programing contest code template
#include <bits/stdc++.h>
using namespace std;
// define
#define for_(i, a, b) for (int i = a; i < b; ++i)
#define for_rev(i, a, b) for (int i = a; i >= b; --i)
#define allof(a) a.begin(), a.end()
#define minit(a, b) memset(a, b, sizeof(a))
#define size_of(a) (int)a.size()
// typedef
typedef long long lint;
typedef double Double;
typedef pair<int, int> pii;
//
typedef vector<int> Array;
typedef vector<Array> Matrix;
typedef vector<Double> DArray;
typedef vector<DArray> DMatrix;
typedef vector<string> SArray;
typedef vector<pii> PArray;
// popcount
inline int POPCNT(int _x) { return __builtin_popcount(_x); }
inline int POPCNT(lint _x) { return __builtin_popcountll(_x); }
// inf
const int iINF = 1L << 30;
const lint lINF = 1LL << 60;
// eps
Double EPS = 1e-9;
// in range
inline bool in_range(int _v, int _mx, int _mi) { return _mi <= _v && _v < _mx; }
inline bool in_range(Double _v, Double _mi, Double _mx) {
  return -EPS < _v - _mi && _v - _mx < EPS;
}
inline bool in_range(int _x, int _y, int _W, int _H) {
  return 0 <= _x && _x < _W && 0 <= _y && _y < _H;
}
// neighbor clockwise
const int DX[4] = {0, 1, 0, -1}, DY[4] = {-1, 0, 1, 0};
const int DX_[8] = {0, 1, 1, 1, 0, -1, -1, -1},
          DY_[8] = {-1, -1, 0, 1, 1, 1, 0, -1};

string S;
int N;
vector<string> ans;

bool use[26];

void rec(int i, string s) {
  if (i == N) {
    ans.push_back(s);
    return;
  }

  int id = S[i] - 'a';
  char nx = S[i] + 1;

  if (use[id]) {
    rec(i + 1, s + S[i]);
  }

  if (S[i] != 'z') {
    use[id + 1] = true;
    rec(i + 1, s + nx);
    use[id + 1] = false;
  }
}

void solve() {
  N = size_of(S);

  ans.clear();
  minit(use, 0);
  use[0] = true;
  rec(0, "");

  // sort(allof(ans));
  int n = size_of(ans);
  cout << n << endl;
  if (n <= 10) {
    for_(i, 0, n) cout << ans[i] << endl;
  } else {
    for_(i, 0, 5) cout << ans[i] << endl;
    for_(i, n - 5, n) cout << ans[i] << endl;
  }
}

int main() {
  while (cin >> S) {
    if (S == "#")
      break;
    solve();
  }
  return 0;
}

Fixed submission:
// tsukasa_diary's programing contest code template
#include <bits/stdc++.h>
using namespace std;
// define
#define for_(i, a, b) for (int i = a; i < b; ++i)
#define for_rev(i, a, b) for (int i = a; i >= b; --i)
#define allof(a) a.begin(), a.end()
#define minit(a, b) memset(a, b, sizeof(a))
#define size_of(a) (int)a.size()
// typedef
typedef long long lint;
typedef double Double;
typedef pair<int, int> pii;
//
typedef vector<int> Array;
typedef vector<Array> Matrix;
typedef vector<Double> DArray;
typedef vector<DArray> DMatrix;
typedef vector<string> SArray;
typedef vector<pii> PArray;
// popcount
inline int POPCNT(int _x) { return __builtin_popcount(_x); }
inline int POPCNT(lint _x) { return __builtin_popcountll(_x); }
// inf
const int iINF = 1L << 30;
const lint lINF = 1LL << 60;
// eps
Double EPS = 1e-9;
// in range
inline bool in_range(int _v, int _mx, int _mi) { return _mi <= _v && _v < _mx; }
inline bool in_range(Double _v, Double _mi, Double _mx) {
  return -EPS < _v - _mi && _v - _mx < EPS;
}
inline bool in_range(int _x, int _y, int _W, int _H) {
  return 0 <= _x && _x < _W && 0 <= _y && _y < _H;
}
// neighbor clockwise
const int DX[4] = {0, 1, 0, -1}, DY[4] = {-1, 0, 1, 0};
const int DX_[8] = {0, 1, 1, 1, 0, -1, -1, -1},
          DY_[8] = {-1, -1, 0, 1, 1, 1, 0, -1};

string S;
int N;
vector<string> ans;

bool use[26];

void rec(int i, string s) {
  if (i == N) {
    ans.push_back(s);
    return;
  }

  int id = S[i] - 'a';
  char nx = S[i] + 1;

  if (use[id]) {
    rec(i + 1, s + S[i]);
  }

  if (S[i] != 'z' && !use[id + 1]) {
    use[id + 1] = true;
    rec(i + 1, s + nx);
    use[id + 1] = false;
  }
}

void solve() {
  N = size_of(S);

  ans.clear();
  minit(use, 0);
  use[0] = true;
  rec(0, "");

  // sort(allof(ans));
  int n = size_of(ans);
  cout << n << endl;
  if (n <= 10) {
    for_(i, 0, n) cout << ans[i] << endl;
  } else {
    for_(i, 0, 5) cout << ans[i] << endl;
    for_(i, n - 5, n) cout << ans[i] << endl;
  }
}

int main() {
  while (cin >> S) {
    if (S == "#")
      break;
    solve();
  }
  return 0;
}