#include <bits/stdc++.h>
using namespace std;
using ll = long long int;
#define inf 1000000000000000LL
#define mod 1000000007LL
#define FOR(i,a,b) for(int i = a; i < b; i++)
const ll Mod = 1000000009LL;
const ll Base = 271LL;

struct hashed_string{
    private:
    string s; ll n;
    vector <ll> prefix;
    vector <ll> pow;
    public:
    hashed_string(string a){
        s = a; n = a.size();
        prefix.assign(n, 0);
        ll sum = 0;
        pow.assign(n+1, 0);
        pow[0] = 1;
        for (int i = 1; i <= n; i++){
            pow[i] = (pow[i-1] * Base) % Mod;
        }
        for (int i = 0; i < n; i++){
            prefix[i] = ((sum * Base) % Mod + s[i] - 'a' + 1) % Mod;
            sum = prefix[i];
        }
    }
    hashed_string(){
    }
    ll get_hash(ll l, ll r){
        ll x = prefix[r];
        if (l >= 1){
            l--;
            x = ((x - prefix[l] * pow[r - l] % Mod) % Mod + Mod) % Mod;
        }
        return x;
    }
};
void solve() {
    ll n;
    cin >> n;
    vector <string> l1(n);
    for (int i = 0; i< n; i++) cin >> l1[i];
    sort(l1.begin(), l1.end(), [&](auto &a, auto &b){
        return a.size() < b.size();
    });
    vector <hashed_string> v(n);
    for (int i = 0; i < n; i++) v[i] = hashed_string(l1[i]);
    vector <bool> good(n, true);
    for (int i = 0; i < n; i++){
        for (int j = i + 1; j < n; j++){
            for (int x = 0; x + l1[i].size() - 1 < l1[j].size(); x++){
                if (v[i].get_hash(0, l1[i].size() - 1) == v[j].get_hash(x, x + l1[i].size() - 1)){
                    good[i] = false;
                    break;
                }
            }
            if (!good[i]) break;
        }
    }
    vector <string> left_over;
    for (int i = 0; i < n; i++) if (good[i]) left_over.push_back(l1[i]);
    for (int i = 0; i < left_over.size(); i++) v[i] = hashed_string(left_over[i]);
    ll cost[left_over.size()][left_over.size()];
    for (int i = 0; i < left_over.size(); i++){
        for (int j = 0; j < left_over.size(); j++){
            if (i == j){
                cost[i][j] = left_over[i].size();
            }
            else{
                cost[i][j] = left_over[j].size();
                for (int x = 1; x <= min(left_over[i].size(), left_over[j].size()); x++){
                    if (v[i].get_hash(left_over[i].size() - x, left_over[i].size() - 1) == v[j].get_hash(0, x - 1)){
                        cost[i][j] = min(cost[i][j], (ll)left_over[j].size() - x);
                    }
                }
            }
        }
    }
    n = left_over.size();
    ll lim = (1LL << n);
    ll dp[lim][n];
    for (int i = 1; i < lim; i++){
        for (int j = 0; j < n; j++){
            dp[i][j] = inf;
            if (i & (1LL << j)){
                if (__builtin_popcount(i) == 1){
                    dp[i][j] = left_over[j].size();
                    break;
                }
                for (int x = 0; x < n; x++){
                    if (x != j && (i & (1LL << x))){
                        dp[i][j] = min(dp[i][j], dp[i ^ (1LL << j)][x] + cost[x][j]);
                    }
                }
            }
        }
    }
    ll answ = inf;  
    for (int i = 0; i < n; i++){
        answ = min(answ, dp[lim - 1][i]);
    }
    cout << answ << "\n";
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    ll t = 1;
    while (t--) {
        solve();
    }

    return 0;
}