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

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

int 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 b.size();
      }
    }
  }
  for (int i = 1; i <= b.size(); i++) {
    if (i > a.size()) {
      break;
    }
    if (a.substr(a.size() - i, a.size()) == b.substr(0, i)) {
      p = max(p, i);
    }
  }
  return p;
}

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;

int main() {
  while (true) {
    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] = SSS(S[i], S[j]);
        }
      }
    }
    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;
    }
    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) {
              dp[k][i + (1 << k)] =
                  max(dp[k][i + (1 << k)], dp[j][i] + x[j][k]);
            }
          }
        }
      }
    }
    for (int i = 0; i < n; i++) {
      minx = max(minx, dp[i][(1 << n) - 1]);
    }
    cout << s - minx << endl;
  }
}

Error: TLE

Fixed submission:

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

int 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 b.size();
      }
    }
  }
  if (a.size() <= b.size()) {
    for (int i = 0; i <= b.size() - a.size(); i++) {
      if (a.substr(i, a.size()) == b) {
        return a.size();
      }
    }
  }
  for (int i = 1; i <= b.size(); i++) {
    if (i > a.size()) {
      break;
    }
    if (a.substr(a.size() - i, a.size()) == b.substr(0, i)) {
      p = max(p, i);
    }
  }
  for (int i = 1; i <= a.size(); i++) {
    if (i > b.size()) {
      break;
    }
    if (b.substr(b.size() - i, b.size()) == a.substr(0, i)) {
      p = max(p, i);
    }
  }
  return p;
}

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

int main() {
  while (true) {
    s = 0;
    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] = SSS(S[i], S[j]);
        }
      }
    }
    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;
    }
    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) {
              dp[k][i + (1 << k)] =
                  max(dp[k][i + (1 << k)], dp[j][i] + x[j][k]);
            }
          }
        }
      }
    }
    for (int i = 0; i < n; i++) {
      minx = max(minx, dp[i][(1 << n) - 1]);
    }
    cout << s - minx << endl;
  }
}