#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int MAXN = 1E2 + 5, MAXLEN = 20;

struct Trie{
	static const int MAXNode = MAXLEN * MAXN * 2, SIGMA = 26;
	static const int INF = 1 << 20;
	int cnt, ch[MAXNode][SIGMA];
	int depth[MAXNode], num[MAXNode];
	int f[MAXNode][MAXN << 1];

	int getNode(){
		memset(ch[cnt], -1, sizeof(ch[0]));
		num[cnt] = 0;
		return cnt++;
	}

	void init(){
		cnt = 0;
		getNode();
	}

	int insert(char *s){
		int u = 0;
		++num[u];
		for (int i = 0; s[i]; ++i){
			int v = s[i] - 'A';
			if (!~ch[u][v]){
				ch[u][v] = getNode();
				depth[ch[u][v]] = depth[u] + 1;
			}
			u = ch[u][v];
			++num[u];
		}
		return u;
	}

	int temp[MAXN << 1];

	void solve(){
		for (int u = cnt - 1; u >= 0; --u){
			if (num[u] == 1){
				f[u][0] = f[u][1] = 0;
				continue;
			}

			f[u][0] = 0;
			for (int i = 1; i <= num[u]; ++i)
				f[u][i] = INF;

			int sum = 0, maxcut = 0;
			for (int v, i = 0; i < SIGMA; ++i){
				if (!~(v = ch[u][i]))
					continue;

				if (num[v] == 1)
					maxcut = max(maxcut, depth[v]);
				else if (num[v] == 2)
					maxcut = max(maxcut, f[v][0] - (depth[u] + 1));
				else
					maxcut = max(maxcut, f[v][0] - f[v][1]);

				sum += num[v];
				for (int j = 0; j <= sum; ++j){
					temp[j] = f[u][j];
					f[u][j] = INF;
				}
				for (int j = 0; j <= sum; ++j)
					for (int k = 0; k <= num[v] && k <= j; ++k)
						f[u][j] = min(f[u][j], temp[j - k] + f[v][k] + depth[v] * ((k == 1) + (num[v] - k == 1)));
			}
			f[u][1] = f[u][num[u] - 1] = num[u] == 2 ? 0 : f[u][0] - maxcut;
		}
	}
}A;

int n;
char s[MAXLEN];

int main(){
	while (scanf("%d", &n) == 1){
		A.init();
		for (int i = n << 1; i > 0; --i){
			scanf("%s", s);
			A.insert(s);
		}

		A.solve();
		printf("%d\n", A.f[0][n] * n);
	}
	return 0;
}
