//#define _DEBUG
#include "bits/stdc++.h"
#define CHOOSE(a) CHOOSE2 a
#define CHOOSE2(a0,a1,a2,a3,a4,x,...) x
#define debug_1(x1) cout<<#x1<<": "<<x1<<endl
#define debug_2(x1,x2) cout<<#x1<<": "<<x1<<", "#x2<<": "<<x2<<endl
#define debug_3(x1,x2,x3) cout<<#x1<<": "<<x1<<", "#x2<<": "<<x2<<", "#x3<<": "<<x3<<endl
#define debug_4(x1,x2,x3,x4) cout<<#x1<<": "<<x1<<", "#x2<<": "<<x2<<", "#x3<<": "<<x3<<", "#x4<<": "<<x4<<endl
#define debug_5(x1,x2,x3,x4,x5) cout<<#x1<<": "<<x1<<", "#x2<<": "<<x2<<", "#x3<<": "<<x3<<", "#x4<<": "<<x4<<", "#x5<<": "<<x5<<endl
#ifdef _DEBUG
#define debug(...) CHOOSE((__VA_ARGS__,debug_5,debug_4,debug_3,debug_2,debug_1,~))(__VA_ARGS__)
#else
#define debug(...)
#endif
#define rep(index,num) for(int index=0;index<(int)num;index++)
#define rep1(index,num) for(int index=1;index<=(int)num;index++)
#define brep(index,num) for(int index=(int)num-1;index>=0;index--)
#define brep1(index,num) for(int index=(int)num;index>0;index--)
#define scan(argument) cin>>argument
#define prin(argument) cout<<argument<<endl
#define kaigyo cout<<endl
#define eps 1e-7
#define mp(a1,a2) make_pair(a1,a2)
#define ALL(a) (a).begin(),(a).end()
#define rALL(a) (a).rbegin(),(a).rend()
typedef long long ll;
typedef long double ld;
using namespace std;
typedef pair<ll,ll> pll;
typedef pair<int,int> pint;
typedef vector<int> vint;
typedef vector<ll> vll;
typedef vector<pint> vpint;
typedef vector<pll> vpll;
ll INFl=(ll)1e+18+1;
int INF=1e+9+1;
/* Trie 木： 文字の種類(char_size)、int型で0に対応する文字(base)
    insert(word): 単語 word を Trie 木に挿入する
    search(word): 単語 word が Trie 木にあるか判定する
    start_with(prefix):  prefix が一致する単語が Trie 木にあるか判定する
    count(): 挿入した単語の数を返す
    size(): Trie 木の頂点数を返す
    計算量：insert, search ともに O(M)（Mは単語の長さ）
*/
template <int char_size, int base>
struct Trie {
    struct Node {            // 頂点を表す構造体
        vector<int> next;    // 子の頂点番号を格納。存在しなければ-1
        vector<int> accept;  // 末端がこの頂点になる単語の word_id を保存
		vector<int> wordid;  // この頂点を共有しているword_idの一覧
        int c;               // base からの間隔をint型で表現したもの
		int depth;			 // 何文字目か
        Node(int c_,int depth_) : c(c_), depth(depth_) {
            next.assign(char_size, -1);
        }
    };

    vector<Node> nodes;  // trie 木本体
    int root;
    Trie() : root(0) {
        nodes.push_back(Node(root,0));
    }

    // 単語の挿入
    void insert(const string &word, int word_id) {
        int node_id = 0;
        for (int i = 0; i < (int)word.size(); i++) {
            int c = (int)(word[i] - base);
            int &next_id = nodes[node_id].next[c];
            if (next_id == -1) {  // 次の頂点が存在しなければ追加
                next_id = (int)nodes.size();
                nodes.push_back(Node(c,i+1));
            }
            nodes[node_id].wordid.push_back(word_id);
            node_id = next_id;
        }
        nodes[node_id].wordid.push_back(word_id);
        nodes[node_id].accept.push_back(word_id);
    }
    void insert(const string &word) {
        insert(word, nodes[0].wordid.size());
    }

    // 単語とprefixの検索
    bool search(const string &word, bool prefix = false) {
        int node_id = 0;
        for (int i = 0; i < (int)word.size(); i++) {
            int c = (int)(word[i] - base);
            int &next_id = nodes[node_id].next[c];
            if (next_id == -1) {  // 次の頂点が存在しなければ終了
                return false;
            }
            node_id = next_id;
        }
        return (prefix) ? true : nodes[node_id].accept.size() > 0;
    }

    // prefix を持つ単語が存在するかの検索
    bool start_with(const string &prefix) {
        return search(prefix, true);
    }

	//prefixを持つword_idの一覧
	vector<int> start_with_list(const string &prefix){
		vector<int> emp;
		int node_id = 0;
		for (int i = 0; i < (int)prefix.size(); i++) {
			int c = (int)(prefix[i] - base);
			int &next_id = nodes[node_id].next[c];
			if (next_id == -1) {  // 次の頂点が存在しなければ終了
				return emp;
			}
			node_id = next_id;
		}
		return nodes[node_id].wordid;
	}

    // 挿入した単語の数
    int count() const {
        return (nodes[0].wordid.size());
    }
    // Trie木のノード数
    int size() const {
        return ((int)nodes.size());
    }
};
string S[200001];
int firsta[200001][26];
int main(){
	int N;
	scan(N);
	Trie<26,'a'> trie;
	fill(firsta[0],firsta[200001],INF);
	rep(i,N){
		scan(S[i]);
		rep(j,S[i].size()){
			firsta[i][S[i][j]-'a']=min(firsta[i][S[i][j]-'a'],j);
		}
		reverse(S[i].begin(),S[i].end());
		trie.insert(S[i],i);
	}
	int ans=0;
	rep(i,N){
		string pref=S[i].substr(0,S[i].size()-1);
		vint prelist=trie.start_with_list(pref);
		for(auto wordid:prelist){
			if(firsta[wordid][S[i].back()-'a']<=(int)(S[wordid].size()-S[i].size())) ans++;
		}
	}
	ans-=N;
	prin(ans);
	return 0;
}


Measured memory_bytes: 249664