目测 long long 是有效的。
//【模板】广义后缀自动机,广义SAM(Trie树离线构造)
#include<bits/stdc++.h>
#define MAXL 1000005
#define MAXD 30
using namespace std;
inline void read(int &n){
int s=0,t=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-') t=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
s=(s<<3)+(s<<1)+(c^48);c=getchar();
}
n=s*t;
}
inline void put(int n){
if(n<0){
putchar('-');n=-n;
}
if(n<10){
putchar(n+48);return;
}
put(n/10);
putchar(n%10+48);
}
inline void llput(long long n){
if(n<0){
putchar('-');n=-n;
}
if(n<10){
putchar(n+48);return;
}
put(n/10);
putchar(n%10+48);
}
int tot,cnt,tr[MAXL],fa[MAXL],len[MAXL<<1],link[MAXL<<1],pos[MAXL],t[MAXL][MAXD],sam[MAXL<<1][MAXD];
char s[MAXL];
inline int exch(char ch){
return ch-'a'+1;
}
inline void trie_insert(){
int len=strlen(s),p=0,c;
for(register int i=0;i<len;++i){
c=exch(s[i]);
if(!t[p][c]) t[p][c]=++tot;
fa[t[p][c]]=p;tr[t[p][c]]=c;p=t[p][c];
}
}
inline int sam_insert(int c,int last){
int cur=++cnt,p=last;
len[cur]=len[last]+1;
while(p!=-1&&!sam[p][c]){
sam[p][c]=cur;p=link[p];
}
if(p==-1) link[cur]=0;
else{
int q=sam[p][c];
if(len[p]+1==len[q]) link[cur]=q;
else{
int clone=++cnt;
len[clone]=len[p]+1;
link[clone]=link[q];
for(register int i=1;i<=26;++i) sam[clone][i]=sam[q][i];
while(p!=-1&&sam[p][c]==q){
sam[p][c]=clone;p=link[p];
}
link[cur]=link[q]=clone;
}
}
return cur;
}
inline void build(){
queue<int>q;
for(register int i=1;i<=26;++i)
if(t[0][i]) q.push(t[0][i]);
link[0]=-1;
while(!q.empty()){
int p=q.front();q.pop();
pos[p]=sam_insert(tr[p],pos[fa[p]]);
for(register int i=1;i<=26;++i)
if(t[p][i]) q.push(t[p][i]);
}
}
inline long long getans(){
long long ans=0;
for(register int i=1;i<=cnt;++i) ans+=len[i]-len[link[i]];
return ans;
}
signed main(){
int n;
read(n);
for(register int i=1;i<=n;++i){
cin>>s;trie_insert();
}
build();
llput(getans());putchar('\n');put(cnt+1);putchar('\n');
return 0;
}