Problem:
Score : 700 points

Problem Statement

Limak can repeatedly remove one of the first two characters of a string,
for example abcxyx \rightarrow acxyx \rightarrow cxyx \rightarrow cyx.

You are given N different strings S_1, S_2, \ldots, S_N.
Among N \cdot (N-1) / 2 pairs (S_i, S_j),
in how many pairs could Limak obtain one string from the other?

Constraints

2 \leq N \leq 200\,000

S_i consists of lowercase English letters a-z.

S_i \neq S_j

1 \leq |S_i|

|S_1| + |S_2| + \ldots + |S_N| \leq 10^6

Input

Input is given from Standard Input in the following format.

N
S_1
S_2
\vdots
S_N

Output

Print the number of unordered pairs (S_i, S_j)
where i \neq j and Limak can obtain one string from the other.

Sample Input 1

3
abcxyx
cyx
abc

Sample Output 1

1

The only good pair is (abcxyx, cyx).

Sample Input 2

6
b
a
abc
c
d
ab

Sample Output 2

5

There are five good pairs: (b, abc), (a, abc), (abc, c), (b, ab), (a, ab).

Solution in C++ (GCC 9.2.1) (judge verdict: Accepted)

#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define all(aaa) aaa.begin(), aaa.end()

const int N = 1e6 + 5, A = 26;
int to[N][A], a[N], ct[N][A];
string s[N];
int cv = 1;

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);

    int n;
    cin >> n;

    for (int i = 0; i < n; i++) {
        cin >> s[i];
        a[i] = i;
    }

    sort(a, a + n, [](const int &x, const int &y) {
        return s[x].size() < s[y].size();
    });

    memset(to, -1, sizeof(to));

    int first_occ[A];

    ll ans = 0;

    for (int i = 0; i < n; i++) {
        fill(first_occ, first_occ + A, -1);
        int ind = a[i];

        for (int j = s[ind].size() - 1; j >= 0; j--) {
            first_occ[s[ind][j] - 'a'] = j;
        }

        // if (i == 4)
        //     cout << first_occ[1] << "\n";

        int v = 0;
        for (int j = s[ind].size() - 1; j >= -1; j--) {
            if (v == -1)
                break;

            for (int k = 0; k < A; k++) {
                if (first_occ[k] != -1 && first_occ[k] <= j) {
                    // if (i == 4)
                    //     cout << v << " " << k << " " << ct[v][k] << "\n";
                    // if (i == 1)
                    
                    ans += ct[v][k];
                }
            }

            if (j == -1)
                break;

            v = to[v][s[ind][j] - 'a'];
        }

        v = 0;
        for (int j = s[ind].size() - 1; j > 0; j--) {
            int c = s[ind][j] - 'a';
            if (to[v][c] == -1) {
                to[v][c] = cv++;
            }
            v = to[v][c];
        }

        ct[v][s[ind][0] - 'a']++;

        // cout << ans << "\n";
    }

    cout << ans << "\n";

	return 0;
}