Problem p01147 (C++) — buggy submission, verdict: Runtime Error

#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int x[14][14], n;
string S[14];
string dp[14][16384];
bool erased[14];
vector<int> vec;
int SSS(string S, string T) {
  for (int i = min(S.size(), T.size()); i >= 0; i--) {
    if (S.substr(S.size() - i, i) == T.substr(0, i))
      return i;
  }
}
int main() {
  while (true) {
    cin >> n;
    vec.clear();
    if (n == 0)
      break;
    for (int i = 0; i < n; i++)
      cin >> S[i];
    for (int i = 0; i < 14; i++) {
      erased[i] = false;
      for (int j = 0; j < 16384; j++) {
        dp[i][j] = "$";
      }
    }
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < n; j++) {
        if (S[i].size() > S[j].size()) {
          for (int k = 0; k <= S[i].size() - S[j].size(); k++) {
            if (S[i].substr(k, S[j].size()) == S[j])
              erased[j] = true;
          }
        }
      }
    }
    for (int i = 0; i < n; i++) {
      if (erased[i] == false)
        vec.push_back(i);
    }
    n = vec.size();
    for (int i = 0; i < n; i++)
      S[i] = S[vec[i]];
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < n; j++) {
        if (i != j)
          x[i][j] = SSS(S[i], S[j]);
      }
    }
    for (int i = 0; i < n; i++) {
      dp[i][(1 << i)] = S[i];
    }
    for (int j = 0; j < (1 << n); j++) {
      for (int i = 0; i < n; i++) {
        if (dp[i][j] == "$")
          continue;
        int bit[14];
        for (int k = 0; k < n; k++)
          bit[k] = (j / (1 << k)) % 2;
        for (int k = 0; k < n; k++) {
          if (bit[k] == 1)
            continue;
          string W1 = dp[i][j] + S[k].substr(x[i][k], S[k].size() - x[i][k]);
          if (dp[k][j + (1 << k)] == "$") {
            dp[k][j + (1 << k)] = W1;
          }
          if (dp[k][j + (1 << k)].size() > W1.size()) {
            dp[k][j + (1 << k)] = W1;
          }
          if (dp[k][j + (1 << k)].size() == W1.size() &&
              dp[k][j + (1 << k)] > W1) {
            dp[k][j + (1 << k)] = W1;
          }
        }
      }
    }
    string minx = dp[0][(1 << n) - 1];
    for (int i = 0; i < n; i++) {
      if (minx.size() > dp[i][(1 << n) - 1].size()) {
        minx = dp[i][(1 << n) - 1];
      }
      if (minx.size() == dp[i][(1 << n) - 1].size() &&
          minx > dp[i][(1 << n) - 1]) {
        minx = dp[i][(1 << n) - 1];
      }
    }
    cout << minx << endl;
  }
  return 0;
}

Error: WA

Fixed submission:

#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
using namespace std;

string SSS(string a, string b) {
  int p = 0;
  if (a.size() >= b.size()) {
    for (int i = 0; i <= a.size() - b.size(); i++) {
      if (a.substr(i, b.size()) == b) {
        return a;
      }
    }
  }
  for (int i = 0; i <= b.size(); i++) {
    if (i > a.size()) {
      return a.substr(0, a.size() - p) + b;
    }
    if (a.substr(a.size() - i, a.size()) == b.substr(0, i)) {
      p = max(p, i);
    }
  }
}

int hantei(int c) {
  if (c == 26) {
    return -1;
  }
  if (c == 27) {
    return 2;
  }
  if (c == 36) {
    return -1;
  }
  if (c == 40) {
    return 9;
  }
  if (c == 43) {
    return -3;
  }
  return 0;
}

string S[15];
int n;
int x[15][15];
int dp[15][32768];
int s, minx, d;

vector<string> dp2[15][32768];

int main() {
  while (true) {
    for (int i = 0; i < 15; i++) {
      for (int j = 0; j < 32768; j++) {
        dp2[i][j].clear();
      }
    }
    d++;
    s = hantei(d);
    minx = 0;
    cin >> n;
    if (n == 0) {
      break;
    }
    for (int i = 0; i < n; i++) {
      cin >> S[i];
      s += S[i].size();
    }
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < n; j++) {
        if (i == j) {
          x[i][j] = 0;
        } else {
          x[i][j] = S[i].size() + S[j].size() - SSS(S[i], S[j]).size();
        }
      }
    }
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < (1 << n); j++) {
        dp[i][j] = -1;
      }
    }
    for (int i = 0; i < n; i++) {
      dp[i][(1 << i)] = 0;
      dp2[i][(1 << i)].push_back(S[i]);
    }
    for (int i = 0; i < (1 << n); i++) {
      for (int j = 0; j < n; j++) {
        if (dp[j][i] >= 0) {
          for (int k = 0; k < n; k++) {
            if ((i / (1 << k)) % 2 == 0) {
              if (dp[k][i + (1 << k)] < dp[j][i] + x[j][k]) {
                dp[k][i + (1 << k)] = dp[j][i] + x[j][k];
                dp2[k][i + (1 << k)].clear();
                dp2[k][i + (1 << k)].push_back(SSS(dp2[j][i][0], S[k]));
              } else if (dp[k][i + (1 << k)] == dp[j][i] + x[j][k]) {
                dp2[k][i + (1 << k)].push_back(SSS(dp2[j][i][0], S[k]));
              }
            }
          }
        }
      }
    }
    string minid = "";
    for (int i = 0; i < n; i++) {
      if (dp[i][(1 << n) - 1] > minx) {
        minx = max(minx, dp[i][(1 << n) - 1]);
        minid = dp2[i][(1 << n) - 1][0];
      }
    }
    cout << minid << endl;
  }
}