#include <stdio.h>
#include <string.h>
#include <algorithm>
#define MaxN 100010
#define MaxL 500010
namespace io{
#define MaxBuf 1<<22
#define Blue() ((S==T&&(T=(S=B)+fread(B,1,MaxBuf,stdin),S==T))?0:*S++)
char B[MaxBuf],*S=B,*T=B;
template<class Type>inline void Rin(Type &x){
x=0;int c=Blue();
for(;c<48||c>57;c=Blue())
;
for(;c>47&&c<58;c=Blue())
x=(x<<1)+(x<<3)+c-48;
}
inline void geTc(char *C,int &x){
x=0;char c=Blue();
for(;c<‘a‘||c>‘z‘;c=Blue())
;
for(;c>=‘a‘&&c<=‘z‘;c=Blue())
*C++=c,x++;
}
}
int n;
char s[MaxL];
long long ans(0LL);
class Trie{
public:
int ch[MaxL][26],tot;
bool val[MaxL];
Trie(){
tot=1;
memset(ch,0,sizeof ch);
memset(val,false,sizeof val);
}
inline void insert(char *C,int len){
int now=1;
for(int i=len-1;~i;i--){
if(!ch[now][C[i]-‘a‘])
ch[now][C[i]-‘a‘]=++tot;
now=ch[now][C[i]-‘a‘];
}
val[now]=true;
}
}T;
namespace DFS{
int sz[MaxN],q[MaxN],top;
struct Pointer{
int to;
Pointer *next;
}*fir[MaxN];
inline void link(int x,int y){
static Pointer mem[MaxN],*tot=mem;
*++tot=(Pointer){y,fir[x]},fir[x]=tot;
}
void _dfs(int at,int fa){
static int timer=1;
if(T.val[at]){
link(fa,++timer);
sz[fa=timer]=1;
}
for(int i=0;i<26;i++)
if(T.ch[at][i])
_dfs(T.ch[at][i],fa);
}
void maintain(int at){
for(Pointer *iter=fir[at];iter;iter=iter->next){
maintain(iter->to);
sz[at]+=sz[iter->to];
}
}
bool cmp(int x,int y){
return sz[x]<sz[y];
}
void calc(int at,int pre){
static int timer;
timer++;
ans+=timer-pre;
pre=timer;
int l=top+1,r=top;
for(Pointer *iter=fir[at];iter;iter=iter->next)
q[++r]=iter->to;
std::sort(q+l,q+1+r,cmp);
top=r;
for(int i=l;i<=r;i++)
calc(q[i],pre);
top=l-1;
}
}
int main(){
io::Rin(n);
for(int i=1,len;i<=n;i++){
io::geTc(s,len);
T.insert(s,len);
}
DFS::_dfs(1,1);
DFS::maintain(1);
DFS::calc(1,1);
printf("%lld\n",ans);
return 0;
}