#include "bits/stdc++.h"
using namespace std;
#define REP(i, n) for(ll i = 0;i < n;i++)
#define ll long long
#define MOD 1000000007LL
#define llMAX 9223372036854775807LL
#define llMIN -9223372036854775808LL
using vi = vector<ll>; // intの1次元の型に vi という別名をつける
using vvi = vector<vi>; // intの2次元の型に vvi という別名をつける
using pll=pair<ll,ll>;

#include <map>

ll n,k,x,y;
map<pll, int> nums;

bool isis(pll _s)
{
  return (nums.find(_s) != nums.end());
}

int main(){
  ll ans=0;
  cin >> n;
  vector<string> s(n);
  REP(i,n) cin>>s[i];

  vvi data(1000001, vi(26));  // 何のアルファベットがあるか、ある1なし0
  vvi arunasi(n, vi(26));  // 何のアルファベットがあるか、ある1なし0、最後の場合のみ

  vector<pair<ll,ll>> myhash(1000001);  // 後ろからみたアルファベットのハッシュ
  vi arufa(26);
  vi findx(n+1);//dataを検索するときに最初にどの位置からみればいいか
  int www=0;
  for(ll i=0;i<n;i++){
    findx[i]=www;
    REP(j,26)arufa[j]=0;
    string __s=s[i];
    for(ll j=0;j<s[i].length();j++){
      for(ll k=0;k<26;k++){
        data[www][k]=arufa[k];
      }
      arufa[__s[j]-97]=1;
      www++;
    }
    for(ll k=0;k<26;k++){
        arunasi[i][k]=arufa[k];
    }
    
  }
  findx[n]=www;

  //hash
  for(ll i=0;i<n;i++){
    string ss="";
    string s_=s[i];
    ll hashh=0;
    ll hashh2=72090754;
    ll rr=1;
    ll rr2=8975487;
    www=findx[i+1]-1;
    for(ll j=s[i].length()-1;j>=1;j--){
      hashh+=(s_[j]-97+1)*rr;
      hashh2+=(s_[j]-97+1)*rr2;
      hashh%=1000000007;
      hashh2%=1000000009;
      myhash[www]=make_pair(hashh,hashh2);
      www--;
      rr*=27;
      rr%=1000000007;
      rr2*=99999997;
      rr2%=1000000009;
    }

  }



  



  
  
  /*
    for (auto it : nums) {
        long long num = it.second; // it.first が it.second 個ある
        res += num * (num - 1) / 2;
    }
    */



  vector<vector<int>> g(4000000, vector<int>(27));
  //g.resize(4000000);
  int gw=0;


  for(int i=0;i<n;i++){
    //string ss="";
    string s_=s[i];
    www=findx[i+1]-1;
    for(ll j=s[i].length()-1;j>=0;j--){
      //ss+=s_[j];
      auto ss=myhash[www];
      
      int tgw=0;
      if (isis(ss)==false)
      {
        gw++;
        nums[ss]=gw;
        tgw=gw;
      }else{
        tgw=nums[ss];
      }


      for(ll k=0;k<26;k++){
        if (data[www][k])
          g[tgw][k]++;
      }
      g[tgw][26]++;
      www--;
    }
  }



  //判定処理
  //まず1文字なら
  vi smm(26);
  for(ll i=0;i<n;i++){
    for(ll k=0;k<26;k++){
      smm[k]+=arunasi[i][k];
    }
  }

  //1文字じゃないなら
  for(ll i=0;i<n;i++){
    string s_=s[i];
    int s_f=s_[0];
    int word=(s_f-97);
    if (s_.length()==1)
    {
      ans+=smm[word]-1;
    }else{
      ll hashh=0;
      ll hashh2=72090754;
      ll rr=1;
      ll rr2=8975487;
      for(ll j=s[i].length()-1;j>=1;j--){
        hashh+=(s_[j]-97+1)*rr;
        hashh2+=(s_[j]-97+1)*rr2;
        hashh%=1000000007;
        hashh2%=1000000009;
        rr*=27;
        rr%=1000000007;
        rr2*=99999997;
        rr2%=1000000009;
      }
      //cout<<hashh<<endl;
      //mapにあれば
      auto pr=make_pair(hashh,hashh2);
      if (isis(pr)){
        ll tgw=nums[pr];
        ans+=g[tgw][word]-1;
        //cout<<g[tgw][word]<<"!"<<endl;
      }
    }


  }




/*
  cout<<isis("a")<<endl;
  cout<<isis("ab")<<endl;
  cout<<isis("abc")<<endl;
  cout<<isis("abcd")<<endl;
  */
  
  cout<<ans<<endl;
  return 0;
}


/*
5
abcxyx
cyx
bc
abc
acbc
*/

Measured memory_bytes: 923360