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

const int INF = 1 << 28;
int dp[1 << 20][20], rec[1 << 20][20], board[20][20];

// generate binary string (not less than k-digit)
string to_binString(int n, int k) {
    string ret = "";
    while(n) ret += ('0' + (n&1)), n >>= 1;
    while(ret.length() < k) ret += '0';
    // reverse(ret.begin(), ret.end());
    return ret;
}
int main() {
    while(1) {
        int N; cin >> N;
        if(!N) break;

        vector<string> vs(N);
        for(int i=0; i<N; i++) {
            cin >> vs[i];
        }

        // init
        for(int bit=0; bit<(1<<N); bit++) {
            fill(dp[bit], dp[bit]+N, INF);
            fill(rec[bit], rec[bit]+N, 0);
        }
        for(int i=0; i<N; i++) {
            dp[1 << i][i] = vs[i].length();
            for(int j=0; j<N; j++) {
                board[i][j] = 0;
            }
        }

        vector< set<string> > S(N);
        for(int i=0; i<N; i++) {
            int M = vs[i].length();
            for(int j=1; j<=M; j++) {
                for(int k=0; k<M-j+1; k++) {
                    S[i].insert(vs[i].substr(k, j));
                }
            }
        }

        for(int i=0; i<N; i++) {
            for(int j=0; j<N; j++) {
                if(i == j) continue;
                int lenI = vs[i].length(), lenJ = vs[j].length();
                int M = min(lenI, lenJ);
                int cnt = 0;
                for(int k=1; k<=M; k++) {
                    string tmpI = vs[i].substr(lenI - k);
                    string tmpJ = vs[j].substr(0, k);
                    if(tmpI == tmpJ) cnt = k;
                }
                board[i][j] = cnt;
            }
        }

        for(int bit=1; bit<(1<<N); bit++) {
            for(int i=0; i<N; i++) {
                if(bit >> i & 1) continue;
                for(int k=0; k<N; k++) {
                    if(bit >> k & 1) {
                        if(S[k].count(vs[i])) {
                            rec[bit][i] = vs[i].size();
                        }
                    }
                }
            }
        }

        for(int bit=1; bit<(1<<N); bit++) {
            for(int i=0; i<N; i++) {
                for(int j=0; j<N; j++) {
                    if(!(bit >> i & 1) || bit >> j & 1) continue;
                    int nbit = bit ^ (1 << j);
                    int sub, nj;
                    if(rec[bit][j]) {
                        nj = i, sub = rec[bit][j];
                        dp[nbit][nj] = min(dp[nbit][nj], dp[bit][i] + (int)vs[j].length() - sub);
                    }
                    nj = j, sub = board[i][j];
                    dp[nbit][nj] = min(dp[nbit][nj], dp[bit][i] + (int)vs[j].length() - sub);
                    // printf("bit = %s, i = %d, j = %d, sub = %d\n", to_binString(bit, N).c_str(), i+1, j+1, sub);
                    // printf("dp[%s][%d] = %d\n", to_binString(nbit, N).c_str(), j+1, dp[nbit][j]);
                }
            }
        }
        int ans = INF;
        for(int i=0; i<N; i++) {
            ans = min(ans, dp[(1<<N)-1][i]);
        }
        cout << ans << endl;
    }
    return 0;
}


Measured memory_bytes: 5820