#include <cstring>
#include <cstdio>
using namespace std;
char s[3000005];
struct Node {
int ch[26];
bool str;
} node[3000005];
int f[3000005];
int cnt = 1;
void insert() {
int n = strlen(s);
for (int i = 0; i < n / 2; i++) {
char c = s[i];
s[i] = s[n - i - 1];
s[n - i - 1] = c;
}
int p = 1;
for (int i = 0; i < n; i++) {
if (node[p].ch[s[i] - 'a'] == 0) {
cnt++;
node[p].ch[s[i] - 'a'] = cnt;
}
p = node[p].ch[s[i] - 'a'];
}
node[p].str = true;
}
int ans;
int max(int a, int b) {
return a > b ? a : b;
}
void solve(int p) {
int fir = 0, sec = 0, cnt = 0;
for (int i = 0; i < 26; i++) {
if (node[p].ch[i] != 0) {
solve(node[p].ch[i]);
if (f[node[p].ch[i]] > fir) {
sec = fir;
fir = f[node[p].ch[i]];
} else if (f[node[p].ch[i]] == fir) {
sec = fir;
} else if (f[node[p].ch[i]] > sec) {
sec = f[node[p].ch[i]];
}
f[p] = max(f[p], f[node[p].ch[i]]);
if (node[p].str) {
cnt++;
}
}
}
if (node[p].str) {
f[p] += max(cnt - 1, 0) + 1;
} else {
f[p] = 0;
}
ans = max(ans, fir + sec + (node[p].str ? 1 : 0) + max(cnt - 2, 0));
}
int main() {
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%s", s);
insert();
}
solve(1);
printf("%d", ans);
return 0;
}