Problem p00899 (C++)

Buggy submission (status: Runtime Error):
#define __USE_MINGW_ANSI_STDIO 0
#include <bits/stdc++.h>

using namespace std;
using ll = long long;
#define int ll
using VI = vector<int>;
using VVI = vector<VI>;
using PII = pair<int, int>;

#define FOR(i, a, n) for (ll i = (ll)a; i < (ll)n; ++i)
#define REP(i, n) FOR(i, 0, n)
#define ALL(x) x.begin(), x.end()
#define PB push_back

const ll LLINF = (1LL << 60);
const int INF = (1LL << 30);
const int MOD = 1000000007;

template <typename T> T &chmin(T &a, const T &b) { return a = min(a, b); }
template <typename T> T &chmax(T &a, const T &b) { return a = max(a, b); }
template <typename T> bool IN(T a, T b, T x) { return a <= x && x < b; }
template <typename T> T ceil(T a, T b) { return a / b + !!(a % b); }
template <class S, class T>
ostream &operator<<(ostream &out, const pair<S, T> &a) {
  out << '(' << a.first << ',' << a.second << ')';
  return out;
}
template <class T> ostream &operator<<(ostream &out, const vector<T> &a) {
  out << '[';
  REP(i, a.size()) {
    out << a[i];
    if (i != a.size() - 1)
      out << ',';
  }
  out << ']';
  return out;
}

int dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0};

signed main(void) {
  cin.tie(0);
  ios::sync_with_stdio(false);

  while (true) {
    int n;
    cin >> n;
    if (!n)
      break;
    vector<string> t(n);
    REP(i, n) cin >> t[i];

    vector<bool> del(n, false);
    REP(i, n) REP(j, n) {
      if (i == j || del[i] || del[j])
        continue;
      REP(k, t[i].size() - t[j].size() + 1) {
        string tmp = t[i].substr(k, t[j].size());
        // cout << tmp << endl;
        if (tmp == t[j])
          del[j] = true;
      }
    }

    vector<string> s;
    REP(i, n) if (!del[i]) s.PB(t[i]);
    n = s.size();

    // cout << s << endl;

    VVI trans(n, VI(n, 0));
    REP(i, n) REP(j, n) {
      if (i == j)
        continue;
      REP(k, min(s[i].size(), s[j].size())) {
        string tmp1 = s[i].substr(s[i].size() - k - 1),
               tmp2 = s[j].substr(0, k + 1);
        // cout << tmp1 << " " << tmp2 << endl;
        if (tmp1 == tmp2)
          trans[i][j] = k + 1;
      }
    }

    // REP(i, n) cout << trans[i] << endl;

    VVI dp(1LL << n, VI(n, INF));
    REP(i, n) dp[1 << i][i] = s[i].size();
    REP(i, 1LL << n) REP(j, n) {
      if (dp[i][j] == INF)
        continue;
      REP(k, n) {
        if (i & 1 << k)
          continue;
        chmin(dp[i | 1 << k][k], dp[i][j] + ((int)s[k].size() - trans[j][k]));
      }
    }

    int ans = INF;
    REP(i, n) chmin(ans, dp[(1LL << n) - 1][i]);
    cout << ans << endl;
  }

  return 0;
}


Fixed submission:
#define __USE_MINGW_ANSI_STDIO 0
#include <bits/stdc++.h>

using namespace std;
using ll = long long;
#define int ll
using VI = vector<int>;
using VVI = vector<VI>;
using PII = pair<int, int>;

#define FOR(i, a, n) for (ll i = (ll)a; i < (ll)n; ++i)
#define REP(i, n) FOR(i, 0, n)
#define ALL(x) x.begin(), x.end()
#define PB push_back

const ll LLINF = (1LL << 60);
const int INF = (1LL << 30);
const int MOD = 1000000007;

template <typename T> T &chmin(T &a, const T &b) { return a = min(a, b); }
template <typename T> T &chmax(T &a, const T &b) { return a = max(a, b); }
template <typename T> bool IN(T a, T b, T x) { return a <= x && x < b; }
template <typename T> T ceil(T a, T b) { return a / b + !!(a % b); }
template <class S, class T>
ostream &operator<<(ostream &out, const pair<S, T> &a) {
  out << '(' << a.first << ',' << a.second << ')';
  return out;
}
template <class T> ostream &operator<<(ostream &out, const vector<T> &a) {
  out << '[';
  REP(i, a.size()) {
    out << a[i];
    if (i != a.size() - 1)
      out << ',';
  }
  out << ']';
  return out;
}

int dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0};

signed main(void) {
  cin.tie(0);
  ios::sync_with_stdio(false);

  while (true) {
    int n;
    cin >> n;
    if (!n)
      break;
    vector<string> t(n);
    REP(i, n) cin >> t[i];

    vector<bool> del(n, false);
    REP(i, n) REP(j, n) {
      if (i == j || del[i] || del[j] || t[i].size() < t[j].size())
        continue;
      REP(k, t[i].size() - t[j].size() + 1) {
        string tmp = t[i].substr(k, t[j].size());
        // cout << tmp << endl;
        if (tmp == t[j])
          del[j] = true;
      }
    }

    vector<string> s;
    REP(i, n) if (!del[i]) s.PB(t[i]);
    n = s.size();

    // cout << s << endl;

    VVI trans(n, VI(n, 0));
    REP(i, n) REP(j, n) {
      if (i == j)
        continue;
      REP(k, min(s[i].size(), s[j].size())) {
        string tmp1 = s[i].substr(s[i].size() - k - 1),
               tmp2 = s[j].substr(0, k + 1);
        // cout << tmp1 << " " << tmp2 << endl;
        if (tmp1 == tmp2)
          trans[i][j] = k + 1;
      }
    }

    // REP(i, n) cout << trans[i] << endl;

    VVI dp(1LL << n, VI(n, INF));
    REP(i, n) dp[1 << i][i] = s[i].size();
    REP(i, 1LL << n) REP(j, n) {
      if (dp[i][j] == INF)
        continue;
      REP(k, n) {
        if (i & 1 << k)
          continue;
        chmin(dp[i | 1 << k][k], dp[i][j] + ((int)s[k].size() - trans[j][k]));
      }
    }

    int ans = INF;
    REP(i, n) chmin(ans, dp[(1LL << n) - 1][i]);
    cout << ans << endl;
  }

  return 0;
}