我太蒻了
码风不好请见谅
#include <bits/stdc++.h>
using namespace std;
int n;
string str[100005];
int b[100005];
int ch[510005][30];
vector<int>to[100005];//dfs前向星链表
map <int,int> a;//trie到dfs的映射
int fa[100005];
int size[100005];
int wz[100005];
int cnttt=0;
int cntt=0;
int cnt=1;
long long ans=0;
bool cmp(int x,int y){
return size[x]<size[y];
}
bool cmpstr(string x,string y){
return x<y;
}
void biuld(string ccc){
int u=1;
int last=1;
for(int i=0;i<ccc.size();i++){
int c=ccc[i]-'a';
if(!ch[u][c]){
ch[u][c]=++cnt;
u=cnt;
}else{
u=ch[u][c];
}
if(b[u])last=u;
}
fa[++cntt]=a[last];
a[u]=cntt;
b[u]=1;
}
void dfsprint(int now){
cout<<now;
for(vector<int>::iterator it=to[now].begin();it!=to[now].end();it++){
dfsprint(*it);
}
}
void dfs1(int now){
if(to[now].size()==0){
size[now]=1;
}else{
size[now]=1;
for(vector<int>::iterator it=to[now].begin();it!=to[now].end();it++){
dfs1(*it);
size[now]+=size[*it];
}
}
}
void dfs2(int now,int last){
//cout<<now<<endl;
++cnttt;
wz[now]=cnttt;
ans+=cnttt-wz[last];
sort(to[now].begin(),to[now].end(),cmp);
for(vector<int>::iterator it=to[now].begin();it!=to[now].end();it++){
dfs2(*it,now);
}
}
int main() {
cin>>n;
for(int i=0;i<=26;i++)ch[0][i]=1;
a[1]=0;
string fk;
for(int i=1;i<=n;i++){
cin>>fk;
int len=fk.size();
str[i]=fk;
for(int j=0;j<len;j++)str[i][j]=fk[len-1-j];
}
sort(str+1,str+n+1);
//for(int i=1;i<=n;i++)cout<<str[i]<<endl;
for(int i=1;i<=n;i++)biuld(str[i]);
for(int i=1;i<=cntt;i++)to[fa[i]].push_back(i);
dfs1(0);
wz[0]=0;
sort(to[0].begin(),to[0].end(),cmp);
for(vector<int>::iterator it=to[0].begin();it!=to[0].end();it++){
dfs2(*it,0);
}
//dfsprint(0);
//for(int i=1;i<=n;i++)cout<<size[i]<<endl;
cout<<ans;
return 0;
}