#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;

// Optimization

//#pragma GCC optimize("O3")
#define endl '\n'

// Shortcut

// #define int long long
#define eb emplace_back
#define pb push_back
#define pob pop_back
#define mp make_pair
#define upb upper_bound
#define lwb lower_bound
#define fi first
#define se second
#define For(i, l, r) for (int i = l; i < r; i++)
#define ForE(i, l, r) for (int i = l; i <= r; i++)
#define Ford(i, r, l) for (int i = r; i > l; i--)
#define FordE(i, r, l) for (int i = r; i >= l; i--)
#define Fora(i, a) for (auto i : a)

// I/O & Debug

#define PrintV(a) Fora(iiii, a) cout << iiii << ' '; cout << endl;
#define PrintVl(a) Fora(iiii, a) cout << iiii << endl;
#define PrintA(a, l, r) for (int iiii = l; iiii <= r; iiii++) cout << a[iiii] << ' '; cout << endl;
#define PrintAl(a, l, r) for (int iiii = l; iiii <= r; iiii++) cout << a[iiii] << endl;
#define Ptest(x) return cout << x, 0;
#define gl(s) getline(cin, s);
#define setpre(x) fixed << setprecision(x)
/*
#define debug(args...){ string _sDEB = #args; replace(_sDEB.begin(), _sDEB.end(), ',', ' '); stringstream _ssDEB(_sDEB); istream_iterator<string> _itDEB(_ssDEB); DEB(_itDEB, args); }
void DEB(istream_iterator<string> it) {}
template<typename T, typename... Args>
void DEB(istream_iterator<string> it, T a, Args... args){
    cout << *it << " = " << a << endl;
    DEB(++it, args...);
}
*/

// Functions

//#define isvowel(a) (a == 'a' || a == 'e' || a == 'i' || a == 'o' || a == 'u')
#define bend(a) a.begin(), a.end()
#define rbend(a) a.rbegin(), a.rend()
#define mset(a) memset(a, 0, sizeof(a))
#define mset1(a) memset(a, 1, sizeof(a))
#define msetn1(a) memset(a, -1, sizeof(a))
#define msetinf(a) memset(a, 0x3f, sizeof(a))
#define gcd __gcd
#define __builtin_popcount __builtin_popcountll
//mt19937 rando(chrono::steady_clock::now().time_since_epoch().count());
//int randt(int l, int r){ return (rando() % (r - l + 1) + l); }

// Data Structure

#define pque priority_queue
#define mts multiset
#define y0 _y0_
#define y1 _y1_
#define div divi
typedef long long ll;
typedef long double ld;
typedef vector <int> vi;
typedef vector <ll> vll;
typedef vector <ld> vld;
typedef vector <string> vs;
typedef pair <int, int> pii;
typedef pair <ll, ll> pll;
typedef vector <vi > vvi;
typedef vector <vll > vvll;
typedef vector <pii > vpii;
typedef vector <pll > vpll;

const int N = 2e5 + 5, K = 26;
int mod = 1e9 + 7, mod1 = 998244353, mod2 = 1e9 + 9, inf = 1e9 + 7;
ll infll = 1e18 + 7;

struct Vertex{
    int next[K];
    int descendants; // total number of descendants, including itself
    int suffix[K]; // how many descendants have char c
    int leaf = 0;
    int p = -1; // parent
    char pch; // edge from p -> this

    Vertex(int p = -1, char ch = '(') : p(p), pch(ch) {
        msetn1(next);
    }
};

vector <Vertex> aho(1);

void add(string &s){
	int cur = 0;
	Fora(ch, s){
		if (aho[cur].next[ch - 'a'] == -1){
			aho[cur].next[ch - 'a'] = aho.size();
			aho.eb(cur, ch);
		}
		cur = aho[cur].next[ch - 'a'];
	}
	aho[cur].leaf++;
}

void del(string &s){
    int cur = 0;
    Fora(ch, s){
        cur = aho[cur].next[ch - 'a'];
    }
    while (cur != 0){
        aho[aho[cur].p].descendants -= aho[cur].descendants;
        For(i, 0, 26){
            aho[aho[cur].p].suffix[i] -= (i == aho[cur].pch - 'a' ? aho[cur].descendants
                                                                  : aho[cur].suffix[i]);
        }
        aho[cur].leaf--;
        aho[cur].descendants--;
        For(i, 0, 26){
            aho[aho[cur].p].suffix[i] += (i == aho[cur].pch - 'a' ? aho[cur].descendants
                                                                  : aho[cur].suffix[i]);
        }
        aho[aho[cur].p].descendants += aho[cur].descendants;
        cur = aho[cur].p;
    }
}

void dfscalsumsuffix(int u){
    For(i, 0, 26){
        if (aho[u].next[i] != -1){
            dfscalsumsuffix(aho[u].next[i]);
        }
    }
    aho[u].descendants += aho[u].leaf;
    if (u != 0){
        For(i, 0, 26){
            aho[aho[u].p].suffix[i] += (i == aho[u].pch - 'a' ? aho[u].descendants
                                                              : aho[u].suffix[i]);
        }
        aho[aho[u].p].descendants += aho[u].descendants;
    }
}

int n;
ll ans;
string s[N];

signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    cin >> n;
    ForE(i, 1, n){
        cin >> s[i];
        reverse(bend(s[i]));
        add(s[i]);
    }
    dfscalsumsuffix(0);
    sort(s + 1, s + 1 + n);
    ForE(i, 1, n){
        del(s[i]);
        int cur = 0;
        For(j, 0, s[i].length() - 1){
            cur = aho[cur].next[s[i][j] - 'a'];
        }
        ans += aho[cur].suffix[s[i].back() - 'a'];
        // cout << ans << endl;
    }
    cout << ans;
}

/*
==================================+
INPUT:                            |
------------------------------    |

------------------------------    |
==================================+
OUTPUT:                           |
------------------------------    |

------------------------------    |
==================================+
*/

Measured memory_bytes: 257028