#include <bits/stdc++.h> using namespace std; #define fo(i,a,b) for(int i=(a);i<(b);i++) #define MOD 1000000007 #define MP make_pair #define PB push_back typedef long long ll; int N, C, sz[500500], x[500500], c[500500], id[500500], mx[500500], dp[500500], len[1<<22], res[500500], rid[500500]; vector<int> ch[500500]; void go (int i) { sz[i] = 1, id[i] = C++, rid[id[i]] = i; for (int j : ch[i]) { x[j] = x[i] ^ c[j], dp[j] = dp[i] + 1; go(j), sz[i] += sz[j]; } mx[i] = C; } void dfs (int i, bool k) { int b = -1; for (int j : ch[i]) if (b == -1 || sz[j] > sz[b]) b = j; for (int j : ch[i]) if (j != b) dfs(j, 0); if (b != -1) dfs(b, 1); for (int j : ch[i]) res[i] = max(res[i], res[j]); for (int j : ch[i]) if (j != b) { fo(t, id[j], mx[j]) { fo(o, 0, 22) if (len[x[rid[t]]^(1<<o)] != -1) { res[i] = max(res[i], len[x[rid[t]]^(1<<o)] + dp[rid[t]] - 2*dp[i]); } if (len[x[rid[t]]] != -1) res[i] = max(res[i], len[x[rid[t]]] + dp[rid[t]] - 2*dp[i]); } fo(t, id[j], mx[j]) len[x[rid[t]]] = max(len[x[rid[t]]], dp[rid[t]]); } fo(o, 0, 22) if (len[x[i]^(1<<o)] != -1) res[i] = max(res[i], len[x[i]^(1<<o)] - dp[i]); if (len[x[i]] != -1) res[i] = max(res[i], len[x[i]] - dp[i]); len[x[i]] = max(len[x[i]], dp[i]); if (!k) fo(t, id[i], mx[i]) len[x[rid[t]]] = -1; } int main () { scanf("%d", &N); fo(i, 1, N) { int p; char t; scanf("%d %c", &p, &t); ch[p-1].PB(i), c[i] = (1<<(t-'a')); } fo(i, 0, 1<<22) len[i] = -1; go(0); dfs(0, 1); fo(i, 0, N) printf("%d ", res[i]); puts(""); return 0; }