#pragma region Macro
#pragma region Basic
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<vi> vvi;
typedef vector<vl> vvl;
#define REP(i, n) for (int i = 0, i##_len = (n); i < i##_len; ++i)
#define FOR(i, a, b) for (int i = (a), i##_len = (b); i < i##_len; i++)
#define FORD(i, a, b) for (int i = (a), i##_len = (b); i > i##_len; i--)
#define FORR(t, a) for (auto t : a)
#define ALL(x) (x).begin(), (x).end()  // sortなどの引数を省略したい
#define GET(i, j) get<j>(i)
#define MT(x, ...) make_tuple(x, __VA_ARGS__)
#define SZ(x) ((int)(x).size())
#define UNUSED(x) (void(x));
#define PB push_back
#define EB emplace_back
#ifdef _DEBUG
#define PRE_COMMAND             \
    std::cin.rdbuf(in.rdbuf()); \
    cout << fixed << setprecision(15);
#else
#define PRE_COMMAND cout << fixed << setprecision(15);
#endif
const double EPS = 1e-10;
const double PI = acos(-1.0);
template <class T>
auto MAX(T& seq) {
    return *max_element(seq.begin(), seq.end());
}
template <class T>
auto MIN(T& seq) {
    return *min_element(seq.begin(), seq.end());
}
template <class T>
auto SUM(T& seq) {
    T temp{0};
    auto& temp2 = temp[0];
    return accumulate(seq.begin(), seq.end(), temp2);
}
template <class T>
void SORT(T& seq) {
    sort(seq.begin(), seq.end());
}
template <class T, class S>
void SORT(T& seq, S& sort_order) {
    sort(seq.begin(), seq.end(), sort_order);
}
template <class T>
void SORTR(vector<T>& seq) {
    sort(seq.begin(), seq.end(), greater<T>());
}
template <class T>
void CHMAX(T& a, const T& b) {
    if (a < b) { a = b; }
}
template <class T>
void CHMIN(T& a, const T& b) {
    if (b < a) { a = b; }
}
template <class T>
set<T> VECTOR_2_SET(vector<T>& v) {
    set<T> s;
    for (auto ele : v) { s.insert(ele); }
    return s;
}
template <class T>
vector<T> SET_2_VECTOR(set<T>& s) {
    vector<T> v;
    for (auto ele : s) { v.push_back(ele); }
    return v;
}
// pythonみたいなスライス
template <class T>
vector<T> SLICE(vector<T>& v, int first, int last, int step) {
    int n = (int)v.size(), now = first;
    vector<T> ret;
    if (first < 0 || n <= last) { return {}; }
    if (step * (last - first) <= 0) { return {}; }
    if (step > 0) {
        while (first <= now && now < last) {
            ret.push_back(v[now]);
            now += step;
        }
    } else {
        while (first >= now && now > last) {
            ret.push_back(v[now]);
            now += step;
        }
    }
    return ret;
}
template <class T, class S, class R>
long long pow(T n_0, S k_0, R mod_0) {
    long long n = n_0;
    long long k = k_0;
    long long mod = mod_0;
    long long now = 1;
    while (true) {
        if (k & 1) { now = now * n % mod; }
        k >>= 1;
        if (k == 0) { return now; }
        n = (n * n) % mod;
    }
}
#pragma endregion Basic
#pragma region Input
template <class Head>
void INPUT(vector<Head>& head);
template <size_t N, class Head>
void INPUT(array<Head, N>& head);
template <class T1>
void INPUT(tuple<T1>& t);
template <class T1, class T2>
void INPUT(tuple<T1, T2>& t);
template <class T1, class T2, class T3>
void INPUT(tuple<T1, T2, T3>& t);
template <class T1, class T2, class T3, class T4>
void INPUT(tuple<T1, T2, T3, T4>& t);
template <class T1, class T2, class T3, class T4, class T5>
void INPUT(tuple<T1, T2, T3, T4, T5>& t);
template <class Head>
void INPUT(Head& head);
template <class Head, class... Tail>
void INPUT(Head& head, Tail&... tail);
//本体
template <class Head>
void INPUT(vector<Head>& head) {
    for (size_t i = 0; i < head.size(); i++) { INPUT(head[i]); }
}
template <size_t N, class Head>
void INPUT(array<Head, N>& head) {
    for (size_t i = 0; i < head.size(); i++) { INPUT(head[i]); }
}
template <class T1>
void INPUT(tuple<T1>& t) {
    cin >> get<0>(t);
}
template <class T1, class T2>
void INPUT(tuple<T1, T2>& t) {
    cin >> get<0>(t) >> get<1>(t);
}
template <class T1, class T2, class T3>
void INPUT(tuple<T1, T2, T3>& t) {
    cin >> get<0>(t) >> get<1>(t) >> get<2>(t);
}
template <class T1, class T2, class T3, class T4>
void INPUT(tuple<T1, T2, T3, T4>& t) {
    cin >> get<0>(t) >> get<1>(t) >> get<2>(t) >> get<3>(t);
}
template <class T1, class T2, class T3, class T4, class T5>
void INPUT(tuple<T1, T2, T3, T4, T5>& t) {
    cin >> get<0>(t) >> get<1>(t) >> get<2>(t) >> get<3>(t) >> get<4>(t);
}
template <class Head>
void INPUT(Head& head) {
    cin >> head;
}
template <class Head, class... Tail>
void INPUT(Head& head, Tail&... tail) {
    INPUT(head);
    INPUT((tail)...);
}
#pragma endregion Input
#pragma region Print
template <class T1>
void PRINT2(tuple<T1> t);
template <class T1, class T2>
void PRINT2(tuple<T1, T2> t);
template <class T1, class T2, class T3>
void PRINT2(tuple<T1, T2, T3> t);
template <class T1, class T2, class T3, class T4>
void PRINT2(tuple<T1, T2, T3, T4> t);
template <class T1, class T2, class T3, class T4, class T5>
void PRINT2(tuple<T1, T2, T3, T4, T5> t);
template <class Head>
void PRINT2(vector<Head> head);
template <class Head>
void PRINT2(vector<vector<Head>> head);
template <size_t N, class Head>
void PRINT2(vector<array<Head, N>> head);
template <class... Head>
void PRINT2(vector<tuple<Head...>> head);
template <size_t N, class Head>
void PRINT2(array<Head, N> head);
template <class Head>
void PRINT2(Head head);
template <class Head, class... Tail>
void PRINT2(Head head, Tail... tail);
template <class Head>
void PRINT(Head head);
template <class... Head>
void PRINT(Head... head);
template <int N, class Head>
void PRINT(Head head);
template <class T1>
void PRINT2(tuple<T1> t) {
    PRINT2(get<0>(t));
}
template <class T1, class T2>
void PRINT2(tuple<T1, T2> t) {
    PRINT2(get<0>(t), get<1>(t));
}
template <class T1, class T2, class T3>
void PRINT2(tuple<T1, T2, T3> t) {
    PRINT2(get<0>(t), get<1>(t), get<2>(t));
}
template <class T1, class T2, class T3, class T4>
void PRINT2(tuple<T1, T2, T3, T4> t) {
    PRINT2(get<0>(t), get<1>(t), get<2>(t), get<3>(t));
}
template <class T1, class T2, class T3, class T4, class T5>
void PRINT2(tuple<T1, T2, T3, T4, T5> t) {
    PRINT2(get<0>(t), get<1>(t), get<2>(t), get<3>(t), get<4>(t));
}
template <class Head>
void PRINT2(vector<Head> head) {
    for (auto i = head.begin(); i != head.end(); i++) {
        PRINT2(*i);
        if (i != head.end() - 1) { cout << " "; }
    }
}
template <class Head>
void PRINT2(vector<vector<Head>> head) {
    for (auto i = head.begin(); i != head.end(); i++) {
        PRINT2(*i);
        if (i != head.end() - 1) { cout << endl; }
    }
}
template <size_t N, class Head>
void PRINT2(vector<array<Head, N>> head) {
    for (auto i = head.begin(); i != head.end(); i++) {
        PRINT2(*i);
        if (i != head.end() - 1) { cout << endl; }
    }
}
template <class... Head>
void PRINT2(vector<tuple<Head...>> head) {
    for (auto i = head.begin(); i != head.end(); i++) {
        PRINT2(*i);
        if (i != head.end() - 1) { cout << endl; }
    }
}
template <size_t N, class Head>
void PRINT2(array<Head, N> head) {
    for (auto i = head.begin(); i != head.end(); i++) {
        PRINT2(*i);
        if (i != head.end() - 1) { cout << " "; }
    }
}
template <class Head>
void PRINT2(Head head) {
    cout << head;
}
template <class Head, class... Tail>
void PRINT2(Head head, Tail... tail) {
    PRINT2(head);
    cout << " ";
    PRINT2((tail)...);
}
template <class Head>
void PRINT(Head head) {
    PRINT2(head);
    cout << endl;
}
template <class... Head>
void PRINT(Head... head) {
    PRINT2((head)...);
    cout << endl;
}
template <int N, class Head>
void PRINT(Head head) {
    PRINT2(head);
    cout << endl;
}
#pragma endregion Print
#pragma endregion Macro

vector<int> tree_dist(vector<vector<int>>& g, int start) {
    int n = (int)g.size(), u, v, inf = pow(10, 9);
    vector<int> q(1, start);
    vector<int> dist(n, inf);
    dist[start] = 0;
    while (q.size()) {
        u = q.back();
        q.pop_back();
        for (int temp : g[u]) {
            v = temp;
            if (dist[v] == inf) {
                q.push_back(v);
                dist[v] = dist[u] + 1;
            }
        }
    }
    return dist;
}

template <class T>
vector<int> argsort(vector<T>& seq, bool reverse = false) {
    int sz = (int)seq.size();
    vector<tuple<T, int>> seq2(sz);
    for (int i = 0; i < sz; i++) { seq2[i] = make_tuple(seq[i], i); }
    if (reverse == false) {
        sort(seq2.begin(), seq2.end(), [](const auto& x, const auto& y) {
            return get<0>(x) < get<0>(y);
        });
    } else {
        sort(seq2.begin(), seq2.end(), [](const auto& x, const auto& y) {
            return get<0>(x) > get<0>(y);
        });
    }
    vector<int> ret(sz);
    for (int i = 0; i < sz; i++) { ret[i] = get<1>(seq2[i]); }
    return ret;
}

int main() {
    PRE_COMMAND
    int n, now, size;
    char c;
    string s;
    bool flag;
    INPUT(n);
    vector<int> c_v = {-1};
    vector<vector<int>> trie = {{}};
    vector<bool> exist = {false};
    vector<int> s_v, parent = {-1};
    vector<string> vector_string(n);  //
    REP(i, n) {
        INPUT(s);
        vector_string[i] = s;  //
        now = 0;
        int s_size = (int)s.size();
        for (int j = s_size - 1; j >= 0; j--) {
            c = s[j];
            flag = true;
            for (int v : trie[now]) {
                if (c_v[v] == c - 'a') {
                    now = v;
                    flag = false;
                    break;
                }
            }
            if (flag) {
                size = (int)trie.size();
                trie.push_back({});
                trie[now].push_back(size);
                c_v.push_back(c - 'a');
                exist.push_back(false);
                parent.push_back(now);
                now = size;
            }
        }
        exist[now] = true;
        s_v.push_back(now);
    }
    vector<int> dist = tree_dist(trie, 0);
    vector<int> arg = argsort(dist, true);
    vector<array<int, 27>> alpha((int)trie.size());

    arg.pop_back();
    for (int v : arg) {
        if (exist[v]) { alpha[v][26]++; }
        int p = parent[v];
        for (int i = 0; i < 27; i++) {
            if (c_v[v] == i) {
                alpha[p][c_v[v]] += alpha[v][26];
            } else {
                alpha[p][i] += alpha[v][i];
            }
        }
    }
    long long ans = 0;
    for (int v : s_v) {
        c = c_v[v];
        int p = parent[v];
        ans += (long long)alpha[p][c] - 1;
    }
    PRINT(ans);
}


Measured memory_bytes: 187716