#include<bits/stdc++.h>
using namespace std;
const int N=52;
inline void read(int &x){
int f=1;x=0;char c=getchar();
while(!isdigit(c)&&c^'-') c=getchar();
if(c=='-') f=-1,c=getchar();
while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();
x*=f;
}
int n,len[N],cnt[N],f[N];
char s[N][N];
int find(int x){return f[x]==x?x:f[x]=find(f[x]);}
inline bool Pre(int x,int y){
if(len[x]>=len[y]) return 0;
for(int i=1;i<=len[x];i++)
if(s[x][i]^s[y][i]) return 0;
return 1;
}
long long ans=1;
int main(){
read(n);
for(int i=1;i<=n;i++){
scanf("%s",s[i]+1);
len[i]=strlen(s[i]+1);
f[i]=i;
for(int j=1;j<i;j++)
if(Pre(i,j)||Pre(j,i))
f[find(j)]=i;
}
for(int i=1;i<=n;i++) ++cnt[find(i)];
for(int i=1;i<=n;i++) ans*=(cnt[i]+1);
printf("%lld",ans);
return 0;
}
找的联通块,一个块内只能选一个或不选,所以方案数是联通块大小加1,最后乘起来,感觉没问题