// #pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
// #pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
//
// #include <immintrin.h>
// #include <emmintrin.h>

#include <bits/stdc++.h>
#pragma GCC optimize("O2")
#define vi vector<int>
#define vpii vector<pii>
#define pii pair<int, int >
#define mp make_pair
#define fi first
#define se second
#define pb push_back
#define LL long long
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define per(i,a,n) for (int i=n;i>=a;i--)
#define all(x) (x).begin(), (x).end()
#define aal(x,n) (x+1), (x+1+n)
#define sz(x) ((int)(x).size())
#define mod(x) ((x)%MOD)
#define eb emplace_back
#define o(X) (1<<(X))
#define oL(X) (1LL<<(X))
#define ppt(x) __builtin_popcount(x)
using namespace std;
const int INF=0x3f3f3f3f,N=1e6+5,MOD=1e9+7;
const LL INF_LL=0x3f3f3f3f3f3f3f3fLL;
template<typename T>
inline int getplc(T x,int y) { return (x>>y)&1; }
template<typename T>
T square(T x) {return x*x;}
LL qpow(LL a,LL b=MOD-2,LL _MOD=MOD){
  LL res=1;
  for(;b;b>>=1,a=a*a%_MOD){
    if(b&1)res=res*a%_MOD;
  }
  return res;
}
template <typename T>
T Smax(T x) { return x; }
template<typename T, typename... Args>
T Smax(T a, Args... args) { return max(a, Smax(args...)); }
template <typename T>
T Smin(T x) { return x; }
template<typename T, typename... Args>
T Smin(T a, Args... args) { return min(a, Smin(args...)); }
template <typename T>
#define errorl(args...) { string _s = #args; replace(_s.begin(), _s.end(), ',', ' '); stringstream _ss(_s); istream_iterator<string> _it(_ss); errl(_it, args); }
void errl(istream_iterator<string> it) {}
template<typename T, typename... Args>
void errl(istream_iterator<string> it, T a, Args... args) {
  cerr << *it << " = " << a << endl;
  errl(++it, args...);
}
#define error(args...) { string _s = #args; replace(_s.begin(), _s.end(), ',', ' '); stringstream _ss(_s); istream_iterator<string> _it(_ss); err(_it, args); cerr<<endl;}
void err(istream_iterator<string> it) {}
template<typename T, typename... Args>
void err(istream_iterator<string> it, T a, Args... args) {
  cerr << *it << "=" << a << " # ";
  err(++it, args...);
}


int c[N][26],len[N],cnt[N],ss,topt;
char s[2*N],*f[N];
void ins(char *s,int len,int y){
  int x=0;
  for(int i=0;i<len;i++){
    int t=s[i]-'a';
    if(!c[x][t])c[x][t]=++topt;
    x=c[x][t];
  }
  cnt[x]+=y;
}
int vis[N];
int ask(char *s,int len){
  for(int i=0;i<len;i++){
    vis[s[i]-'a']++;
  }
  int x=0,res=0;
  for(int i=0;i<len;i++){
    int t=s[i]-'a';
    for(int j=0;j<26;j++){
      /* error(j,c[x][j],cnt[c[x][j]],vis[j]); */
      if(j!=t&&vis[j])res+=cnt[c[x][j]];
    }
    x=c[x][t];
    res+=cnt[x];
    vis[t]--;
  }
  /* error(s,res); */
  return res;
}
void Solve() {
  int n;
  cin>>n;
  for(int i=1;i<=n;i++){
    f[i]=s+ss;
    cin>>f[i];
    len[i]=strlen(f[i]);
    reverse(f[i],f[i]+len[i]);
    ss+=len[i]+2;
  }
  for(int i=1;i<=n;i++){
    /* rins(f[i],len[i],1); */
    ins(f[i],len[i],1);
  }
  LL ans=0;
  for(int i=1;i<=n;i++){
    /* ins(f[i],len[i],-1); */
    ans+=ask(f[i],len[i]);
  }
  for(int i=1;i<=topt;i++)
    ans-=(LL)cnt[i]+(LL)cnt[i]*(cnt[i]-1)/2;

  cout<<ans<<endl;
}

int main() {
#ifndef ONLINE_JUDGE
  freopen("in.txt","r",stdin);
//  freopen("o1.txt","w",stdout);
#endif
  ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);
  Solve();
  return 0;
}


Measured memory_bytes: 109156