structNode{ int len,fa; int ch[26]; }tr[N]; char str[N]; ll f[N],ans; int h[N],e[N],ne[N],idx,last=1,tot=1;
voidadd(int a,int b) { e[idx]=b,ne[idx]=h[a],h[a]=idx++; }
voidextend(int c) { int p=last;int np=++tot; f[tot]=1; tr[np].len=tr[p].len+1; for (;p&&!tr[p].ch[c];p=tr[p].fa) tr[p].ch[c]=np; last=tot; if (!p) tr[np].fa=1; else{ int q=tr[p].ch[c]; if (tr[q].len==tr[p].len+1) tr[np].fa=q; else{ int nq=++tot; tr[nq]=tr[q],tr[nq].len=tr[p].len+1; tr[q].fa=tr[np].fa=nq; for (;p&&tr[p].ch[c]==q;p=tr[p].fa) tr[p].ch[c]=nq; } } }
voiddfs(int x) { for (int i=h[x];~i;i=ne[i]) { dfs(e[i]);f[x]+=f[e[i]]; } if (f[x]>1) ans=max(ans,f[x]*tr[x].len); }
intmain() { scanf("%s",str); for (int i=0;str[i];++i) extend(str[i]-'a'); memset(h,-1,sizeof h); for (int i=2;i<=tot;++i) add(tr[i].fa,i); dfs(1); cout<<ans<<endl; return0; }
structNode{ int fa,len; int ch[4]; }tr[N]; int last=1,tot=1; char str[N];
voidextend(int c) { int p=last,np=last=++tot; tr[np].len=tr[p].len+1; for (;p&&!tr[p].ch[c];p=tr[p].fa) tr[p].ch[c]=np; if (!p) tr[np].fa=1; else{ int q=tr[p].ch[c]; if (tr[q].len==tr[p].len+1) tr[np].fa=q; else{ int nq=++tot; tr[nq]=tr[q],tr[nq].len=tr[p].len+1; tr[q].fa=tr[np].fa=nq; for (;p&&tr[p].ch[c]==q;p=tr[p].fa) tr[p].ch[c]=nq; } } }
structNode{ int len,fa; int ch[26]; }tr[2*N]; int last=1,tot=1,now[N],ans[N]; char str[N]; int h[N],e[N],ne[N],idx;
voidextend(int c) { int p=last,np=last=++tot; tr[np].len=tr[p].len+1; for (;p&&!tr[p].ch[c];p=tr[p].fa) tr[p].ch[c]=np; if (!p) tr[np].fa=1; else{ int q=tr[p].ch[c]; if (tr[q].len==tr[p].len+1) tr[np].fa=q; else{ int nq=++tot; tr[nq]=tr[q],tr[nq].len=tr[p].len+1; tr[q].fa=tr[np].fa=nq; for (;p&&tr[p].ch[c]==q;p=tr[p].fa) tr[p].ch[c]=nq; } } }
voidadd(int a,int b) { e[idx]=b,ne[idx]=h[a],h[a]=idx++; }
voidcalc() { int i,p=1,t=0; memset(now,0,sizeof now); for (i=0;str[i];++i) { int c=str[i]-'a'; while (p>1&&!tr[p].ch[c]) p=tr[p].fa,t=tr[p].len; if (tr[p].ch[c]) p=tr[p].ch[c],t++; now[p]=max(now[p],t); } tree(1); for (int i=1;i<=tot;++i) ans[i]=min(ans[i],now[i]); }
intmain() { int n; cin>>n;n--; scanf("%s",str);memset(h,-1,sizeof h); for (int i=0;str[i];++i) extend(str[i]-'a'); for (int i=1;i<=tot;++i) ans[i]=tr[i].len; for (int i=2;i<=tot;++i) add(tr[i].fa,i); while (n--) { scanf("%s",str); calc(); } int finalres=0; for (int i=1;i<=tot;++i) finalres=max(finalres,ans[i]); cout<<finalres<<endl; }