QwQ
#include <bits/stdc++.h>
#define MAXN 1000005
using namespace std;
string s;
int rk[MAXN], nrk[MAXN], n, anc[MAXN][21], sa[MAXN], h[MAXN], hs[MAXN], de[MAXN], endrk[MAXN], ansans[MAXN];
vector<int> vec[MAXN], vect;
vector<pair<vector<int>, int> > vecto[MAXN];
vector<int> ans[MAXN];
inline bool cmp(const int i, const int j)
{
return ((endrk[anc[i][0]] != endrk[anc[j][0]]) ? (endrk[anc[i][0]] < endrk[anc[j][0]]) : (i < j));
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n;
for (int i = 2; i <= n; i++)
{
cin >> anc[i][0];
for (int j = 1; j <= 20; j++)
{
anc[i][j] = anc[anc[i][j - 1]][j - 1];
}
}
cin >> s;
s = " " + s + " ";
for (int i = 1; i <= n; i++)
{
rk[i] = s[i];
hs[i] = hs[anc[i][0]] * 131 + s[i];
de[i] = de[anc[i][0]] + 1;
}
/*
for (int i = 1; i <= n; i++)
{
cout << rk[i] << " ";
}
cout << endl;
*/
int k = -1;
while (k <= 20)
{
k++;
for (int i = 1; i <= n; i++)
{
int prk = rk[anc[i][k]];
vec[prk].push_back(i);
// cout << i << " -> " << prk << endl;
}
for (int i = 0; i <= max(n, 128); i++)
{
for (int j : vec[i])
{
// cout << j << " " << i << endl;
vect.push_back(j);
}
vec[i].clear();
}
for (int i : vect)
{
// cout << i << " ";
vec[rk[i]].push_back(i);
}
// cout << endl;
vect.clear();
int cnt = 0;
for (int i = 0; i <= max(n, 128); i++)
{
for (int j = 0; j < vec[i].size(); j++)
{
if (j == 0 || rk[anc[vec[i][j - 1]][k]] != rk[anc[vec[i][j]][k]])
{
cnt++;
}
nrk[vec[i][j]] = cnt;
}
vec[i].clear();
}
memcpy(rk, nrk, sizeof(rk));
/*
for (int i = 1; i <= n; i++)
{
cout << rk[i] << " ";
}
cout << endl;
*/
}
for (int i = 1; i <= n; i++)
{
sa[rk[i]] = i;
// cout << rk[i] << " ";
}
// cout << endl;
// for (int i = 1; i <= n; i++)
// {
// cout << hs[i] << "\t" << de[i] << endl;
// }
for (int i = 1, cnt = 0; i <= n; i++)
{
if (hs[sa[i]] != hs[sa[i - 1]])
{
vect.clear();
// cout << de[sa[i]] << ": ";
for (int j = i; hs[sa[j]] == hs[sa[i]]; j++)
{
vect.push_back(sa[j]);
// cout << sa[j] << " ";
}
// cout << endl;
vecto[de[sa[i]]].push_back({vect, i});
}
}
for (int i = 1; i <= n; i++)
{
int cnt = 0;
for (pair<vector<int>, int> j : vecto[i])
{
vector<int> now = j.first;
sort(now.begin(), now.end(), cmp);
for (int k : now)
{
endrk[k] = ++cnt;
// cout << k << " ";
}
// cout << " *" << j.second << endl;
ans[j.second] = now;
}
}
// for (int i = 1; i <= n; i++)
// {
// cout << sa[i] << " ";
// }
// cout << endl;
// for (int i = 1; i <= n; i++)
// {
// cout << endrk[i] << " ";
// }
// cout << endl;
// int cnt = 0;
for (int i = 1; i <= n; i++)
{
for (int j : ans[i])
{
// ansans[j] = ++cnt;
cout << j << " ";
}
}
// for (int i = 1; i <= n; i++)
// {
// cout << ansans[i] << " ";
// }
return 0;
}