Language: C++

#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;
      // cout << "i:" << bitset<5>(i) << " " << j << endl;
      REP(k, n) {
        if(i&1<<k) continue;
        chmin(dp[i|1<<k][k], dp[i][j]+(s[k].size()-trans[j][k]));
        // cout << bitset<5>(i|1<<k) << " " << dp[i|1<<k][k] << endl;
      }
    }

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

  return 0;
}



Compiler output:
a.cc: In function 'int main()':
a.cc:86:14: error: no matching function for call to 'chmin(__gnu_cxx::__alloc_traits<std::allocator<long long int>, long long int>::value_type&, long long unsigned int)'
   86 |         chmin(dp[i|1<<k][k], dp[i][j]+(s[k].size()-trans[j][k]));
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
a.cc:20:26: note: candidate: 'template<class T> T& chmin(T&, const T&)'
   20 | template <typename T> T &chmin(T &a, const T &b) { return a = min(a, b); }
      |                          ^~~~~
a.cc:20:26: note:   template argument deduction/substitution failed:
a.cc:86:14: note:   deduced conflicting types for parameter 'const T' ('long long int' and 'long long unsigned int')
   86 |         chmin(dp[i|1<<k][k], dp[i][j]+(s[k].size()-trans[j][k]));
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~