#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;
}