#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
template<class T, class T2> inline void chkmax(T &x, const T2 &y) { if(x < y) x = y; }
template<class T, class T2> inline void chkmin(T &x, const T2 &y) { if(x > y) x = y; }
const int MAXN = (1 << 20);
struct suffix_automaton
{
map<char, int> to[MAXN];
int len[MAXN], link[MAXN];
int last, psz = 0;
void add_letter(char c)
{
int p = last, cl, q;
if(to[p].count(c))
{
q = to[p][c];
if(len[q] == len[p] + 1)
{
last = q;
return;
}
cl = psz++;
len[cl] = len[p] + 1;
to[cl] = to[q];
link[cl] = link[q];
link[q] = cl;
last = cl;
for(; to[p][c] == q; p = link[p])
to[p][c] = cl;
return;
}
last = psz++;
len[last] = len[p] + 1;
for(; to[p][c] == 0; p = link[p])
to[p][c] = last;
if(to[p][c] == last)
{
link[last] = p;
return;
}
q = to[p][c];
if(len[q] == len[p] + 1)
{
link[last] = q;
return;
}
cl = psz++;
len[cl] = len[p] + 1;
to[cl] = to[q];
link[cl] = link[q];
link[q] = cl;
link[last] = cl;
for(; to[p][c] == q; p = link[p])
to[p][c] = cl;
}
void clear()
{
for(int i = 0; i < psz; i++)
len[i] = 0, link[i] = 0, to[i].clear();
psz = 1;
last = 0;
}
void init(string s)
{
clear();
for(int i = 0; i < (int)s.size(); i++)
add_letter(s[i]);
}
suffix_automaton() { memset(link, 0, sizeof(link)); memset(len, 0, sizeof(len)); clear();}
};
int n;
vector<int> G[MAXN];
string s[MAXN];
void read()
{
cin >> n;
for(int i = 2; i <= n; i++)
{
int p;
cin >> p;
G[p].push_back(i);
}
for(int i = 1; i <= n; i++)
cin >> s[i];
}
int tr_sz[MAXN];
suffix_automaton sa;
int answer = -1;
void pre_dfs(int u, int pr)
{
tr_sz[u] = s[u].size();
for(int v: G[u])
if(v != pr)
{
pre_dfs(v, u);
tr_sz[u] += tr_sz[v];
}
}
void add_vertex(int u)
{
sa.last = 0;
for(auto it: s[u])
sa.add_letter(it);
}
void check_vertex(int u)
{
int x = 0, l = 0;
for(auto c: s[u])
{
while(x != 0 && !sa.to[x].count(c)) x = sa.link[x], l = sa.len[x];
if(sa.to[x].count(c)) l++, x = sa.to[x][c];
chkmax(answer, l);
}
}
void add(int u, int pr)
{
add_vertex(u);
for(int v: G[u])
if(v != pr)
add(v, u);
}
void check(int u, int pr)
{
check_vertex(u);
for(int v: G[u])
if(v != pr)
check(v, u);
}
void dfs(int u, int pr, int keep)
{
pair<int, int> mx = {-1, -1};
for(int v: G[u])
if(v != pr)
mx = max(mx, {tr_sz[v], v});
for(int v: G[u])
if(v != pr && v != mx.second)
dfs(v, u, 0);
if(mx.second != -1)
dfs(mx.second, u, 1);
for(int v: G[u])
if(v != pr && v != mx.second)
{
check(v, u);
add(v, u);
}
add_vertex(u);
if(keep) return;
sa.clear();
}
void solve()
{
sa.clear();
pre_dfs(1, -1);
dfs(1, -1, 1);
cout << answer << endl;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
read();
solve();
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgZW5kbCAnXG4nCgp1c2luZyBuYW1lc3BhY2Ugc3RkOwp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBUMj4gaW5saW5lIHZvaWQgY2hrbWF4KFQgJngsIGNvbnN0IFQyICZ5KSB7IGlmKHggPCB5KSB4ID0geTsgfQp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBUMj4gaW5saW5lIHZvaWQgY2hrbWluKFQgJngsIGNvbnN0IFQyICZ5KSB7IGlmKHggPiB5KSB4ID0geTsgfQpjb25zdCBpbnQgTUFYTiA9ICgxIDw8IDIwKTsKCnN0cnVjdCBzdWZmaXhfYXV0b21hdG9uCnsKCW1hcDxjaGFyLCBpbnQ+IHRvW01BWE5dOwoJaW50IGxlbltNQVhOXSwgbGlua1tNQVhOXTsKCWludCBsYXN0LCBwc3ogPSAwOwoKCXZvaWQgYWRkX2xldHRlcihjaGFyIGMpCgl7CgkJaW50IHAgPSBsYXN0LCBjbCwgcTsKCQlpZih0b1twXS5jb3VudChjKSkKCQl7CiAgCQkJcSA9IHRvW3BdW2NdOwoJCQlpZihsZW5bcV0gPT0gbGVuW3BdICsgMSkKCQkJewoJCQkJbGFzdCA9IHE7CgkJCQlyZXR1cm47CgkJCX0KCgkJCWNsID0gcHN6Kys7CgkJCWxlbltjbF0gPSBsZW5bcF0gKyAxOwoJCQl0b1tjbF0gPSB0b1txXTsKCQkJbGlua1tjbF0gPSBsaW5rW3FdOwoJCQlsaW5rW3FdID0gY2w7CgkJCWxhc3QgPSBjbDsKCQoJCQlmb3IoOyB0b1twXVtjXSA9PSBxOyBwID0gbGlua1twXSkKCQkJCXRvW3BdW2NdID0gY2w7CgkJCQoJCQlyZXR1cm47CgkJfQoKCQlsYXN0ID0gcHN6Kys7CgkJbGVuW2xhc3RdID0gbGVuW3BdICsgMTsKCgkJZm9yKDsgdG9bcF1bY10gPT0gMDsgcCA9IGxpbmtbcF0pCgkJCXRvW3BdW2NdID0gbGFzdDsKCQoJCWlmKHRvW3BdW2NdID09IGxhc3QpIAoJCXsKCQkJbGlua1tsYXN0XSA9IHA7CgkJCXJldHVybjsKCQl9CgoJCXEgPSB0b1twXVtjXTsKCQlpZihsZW5bcV0gPT0gbGVuW3BdICsgMSkKCQl7CgkJCWxpbmtbbGFzdF0gPSBxOwoJCQlyZXR1cm47CgkJfQoKCQljbCA9IHBzeisrOwoJCWxlbltjbF0gPSBsZW5bcF0gKyAxOwoJCXRvW2NsXSA9IHRvW3FdOwoJCWxpbmtbY2xdID0gbGlua1txXTsKCQlsaW5rW3FdID0gY2w7CgkJbGlua1tsYXN0XSA9IGNsOwoKCQlmb3IoOyB0b1twXVtjXSA9PSBxOyBwID0gbGlua1twXSkKCQkJdG9bcF1bY10gPSBjbDsKCX0KCgl2b2lkIGNsZWFyKCkKCXsKCQlmb3IoaW50IGkgPSAwOyBpIDwgcHN6OyBpKyspCgkJCWxlbltpXSA9IDAsIGxpbmtbaV0gPSAwLCB0b1tpXS5jbGVhcigpOwoJCXBzeiA9IDE7CgkJbGFzdCA9IDA7Cgl9CgoJdm9pZCBpbml0KHN0cmluZyBzKQoJewoJCWNsZWFyKCk7CgkJZm9yKGludCBpID0gMDsgaSA8IChpbnQpcy5zaXplKCk7IGkrKykKCQkJYWRkX2xldHRlcihzW2ldKTsKCX0KCQoJc3VmZml4X2F1dG9tYXRvbigpIHsgbWVtc2V0KGxpbmssIDAsIHNpemVvZihsaW5rKSk7IG1lbXNldChsZW4sIDAsIHNpemVvZihsZW4pKTsgY2xlYXIoKTt9Cn07CgppbnQgbjsKdmVjdG9yPGludD4gR1tNQVhOXTsKc3RyaW5nIHNbTUFYTl07Cgp2b2lkIHJlYWQoKQp7CgljaW4gPj4gbjsKCWZvcihpbnQgaSA9IDI7IGkgPD0gbjsgaSsrKQoJewoJCWludCBwOwoJCWNpbiA+PiBwOwoJCUdbcF0ucHVzaF9iYWNrKGkpOwoJfQoKCWZvcihpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKQoJCWNpbiA+PiBzW2ldOwp9CgppbnQgdHJfc3pbTUFYTl07CnN1ZmZpeF9hdXRvbWF0b24gc2E7CmludCBhbnN3ZXIgPSAtMTsKCnZvaWQgcHJlX2RmcyhpbnQgdSwgaW50IHByKQp7Cgl0cl9zelt1XSA9IHNbdV0uc2l6ZSgpOwoJZm9yKGludCB2OiBHW3VdKQoJCWlmKHYgIT0gcHIpCgkJewoJCQlwcmVfZGZzKHYsIHUpOwoJCQl0cl9zelt1XSArPSB0cl9zelt2XTsKCQl9Cn0KCnZvaWQgYWRkX3ZlcnRleChpbnQgdSkKewoJc2EubGFzdCA9IDA7Cglmb3IoYXV0byBpdDogc1t1XSkKCQlzYS5hZGRfbGV0dGVyKGl0KTsKfQoKdm9pZCBjaGVja192ZXJ0ZXgoaW50IHUpCnsKCWludCB4ID0gMCwgbCA9IDA7Cglmb3IoYXV0byBjOiBzW3VdKQoJewoJCXdoaWxlKHggIT0gMCAmJiAhc2EudG9beF0uY291bnQoYykpIHggPSBzYS5saW5rW3hdLCBsID0gc2EubGVuW3hdOwoJCWlmKHNhLnRvW3hdLmNvdW50KGMpKSBsKyssIHggPSBzYS50b1t4XVtjXTsKCQljaGttYXgoYW5zd2VyLCBsKTsKCX0KfQoKdm9pZCBhZGQoaW50IHUsIGludCBwcikKewoJYWRkX3ZlcnRleCh1KTsKCWZvcihpbnQgdjogR1t1XSkKCQlpZih2ICE9IHByKQoJCQlhZGQodiwgdSk7Cn0KCnZvaWQgY2hlY2soaW50IHUsIGludCBwcikKewoJY2hlY2tfdmVydGV4KHUpOwoJZm9yKGludCB2OiBHW3VdKQoJCWlmKHYgIT0gcHIpCgkJCWNoZWNrKHYsIHUpOwp9Cgp2b2lkIGRmcyhpbnQgdSwgaW50IHByLCBpbnQga2VlcCkKewoJcGFpcjxpbnQsIGludD4gbXggPSB7LTEsIC0xfTsKCWZvcihpbnQgdjogR1t1XSkKCQlpZih2ICE9IHByKQoJCQlteCA9IG1heChteCwge3RyX3N6W3ZdLCB2fSk7CgoJZm9yKGludCB2OiBHW3VdKQoJCWlmKHYgIT0gcHIgJiYgdiAhPSBteC5zZWNvbmQpCgkJCWRmcyh2LCB1LCAwKTsKCglpZihteC5zZWNvbmQgIT0gLTEpCgkJZGZzKG14LnNlY29uZCwgdSwgMSk7CgoJZm9yKGludCB2OiBHW3VdKQoJCWlmKHYgIT0gcHIgJiYgdiAhPSBteC5zZWNvbmQpCgkJewoJCQljaGVjayh2LCB1KTsKCQkJYWRkKHYsIHUpOwoJCX0KCglhZGRfdmVydGV4KHUpOwoKCWlmKGtlZXApIHJldHVybjsKCXNhLmNsZWFyKCk7Cn0KCnZvaWQgc29sdmUoKQp7CglzYS5jbGVhcigpOwoJcHJlX2RmcygxLCAtMSk7CglkZnMoMSwgLTEsIDEpOwoJY291dCA8PCBhbnN3ZXIgPDwgZW5kbDsKfQoKaW50IG1haW4oKQp7Cglpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKCWNpbi50aWUoTlVMTCk7CgoJcmVhZCgpOwoJc29sdmUoKTsKCXJldHVybiAwOwp9