#include using namespace std; const int INF = 1000000; struct segment_tree{ int N; vector> ST; segment_tree(vector &A){ int N2 = A.size(); N = 1; while (N < N2){ N *= 2; } ST = vector>(N * 2 - 1, make_pair(INF, 0)); for (int i = 0; i < N2; i++){ ST[N - 1 + i] = make_pair(A[i], i); } for (int i = N - 2; i >= 0; i--){ ST[i] = min(ST[i * 2 + 1], ST[i * 2 + 2]); } } pair range_min(int L, int R, int i, int l, int r){ if (r <= L || R <= l){ return make_pair(INF, 0); } else if (L <= l && r <= R){ return ST[i]; } else { int m = (l + r) / 2; return min(range_min(L, R, i * 2 + 1, l, m), range_min(L, R, i * 2 + 2, m, r)); } } pair range_min(int L, int R){ return range_min(L, R, 0, 0, N); } }; int main(){ int N; cin >> N; vector S(N); for (int i = 0; i < N; i++){ cin >> S[i]; } vector L(N); for (int i = 0; i < N; i++){ L[i] = S[i].size(); } long long ans = 0; if (N > 1){ vector P(N - 1, 0); for (int i = 0; i < N - 1; i++){ while (P[i] < L[i] && P[i] < L[i + 1]){ if (S[i][P[i]] == S[i + 1][P[i]]){ P[i]++; } else { break; } } } segment_tree ST(P); queue> Q; Q.push(make_pair(0, N - 1)); while (!Q.empty()){ int l = Q.front().first; int r = Q.front().second; Q.pop(); pair p = ST.range_min(l, r); int mn = p.first; int m = p.second; long long S1 = (long long) (m - l + 1) * (m - l + 2) / 2 * (r - m); long long S2 = (long long) (r - m) * (r - m + 1) / 2 * (m - l + 1); ans += (S1 + S2) * mn; if (l != m){ Q.push(make_pair(l, m)); } if (m + 1 != r){ Q.push(make_pair(m + 1, r)); } } } for (int i = 0; i < N; i++){ ans += L[i]; } cout << ans << endl; }