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: Runtime Error)

#include<iostream>
#include<cstring>
using namespace std;
struct Trie{
    int next[27];
    int cnt;
    int type;
    void init(){
        cnt=0;
        memset(next,-1,sizeof next);
    }
}T[1000005];
int dp[100005][27],val[1000005];
int le;
void Insert(string s){
    int p=0,len=s.size();
    for (int i=len-1;i>=0;i--){
        int r=s[i]-'a';
        if(T[p].next[r]==-1){
            T[le].init();
            T[le].type=r;
            T[p].next[r]=le++;
        }
        p=T[p].next[r];
        T[p].cnt++;  
    }
	val[p]++;
}
void dfs(int x){
	for(int i=0,v;i<26;i++){
		v=T[x].next[i];
		if(v<=0) continue;
		dfs(v);
		val[x]+=val[v];
		for(int j=0;j<26;j++){
			dp[x][j]+=dp[v][j];
		}
	}
	dp[x][T[x].type]=val[x];
}
long long xx;
long long query(string s){
    int p=0,len=s.size();
    xx=0;
    for (int i=len-1;i>=1;i--) {
        int r=s[i]-'a';
        if(T[p].next[r]<=0) {
            return 0;
        }
        p=T[p].next[r];
    }
   	for(int i=0,v;i<26;i++){
   		v=T[p].next[i];
   		if(v<=0) continue;
   		xx+=dp[v][s[0]-'a'];
	}
	return xx;
}
string s[1000005];
int n;
long long ans;
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    T[0].init();
    le=1;
    cin>>n;
    for(int i=1;i<=n;i++){
    	cin>>s[i];
    	Insert(s[i]);
	}
	dfs(0);
    for(int i=1;i<=n;i++){
    	ans+=query(s[i]);
	}
	cout<<ans-n;
}