#include<bits/stdc++.h>usingnamespacestd;/*~~~~~~~~~~~~~~~~~~~~ Boundary Line ~~~~~~~~~~~~~~~~~~~~*/constintN=5e5+5,M=(1<<22)+5;intn;intc[N],fa[N];vector<int>v[N];/*~~~~~~~~~~~~~~~~~~~~ Boundary Line ~~~~~~~~~~~~~~~~~~~~*/intdep[N];intidx,dfn[N],rnk[N];intsiz[N],son[N];voidbuild(intx){siz[x]=1;dfn[x]=++idx;rnk[idx]=x;dep[x]=dep[fa[x]]+1;c[x]^=c[fa[x]];for(autoy:v[x]){if(y==fa[x])continue;build(y);siz[x]+=siz[y];if(son[x]==0||siz[son[x]]<siz[y])son[x]=y;}}intnow=0;intt[M],ans[N];voidGetans(intx,inttop){now=max(now,t[c[x]]+dep[x]-2*dep[top]);for(inti=0;i<22;i++)now=max(now,t[c[x]^(1<<i)]+dep[x]-2*dep[top]);}voidupdate(intx){t[c[x]]=max(t[c[x]],dep[x]);}voidsolve(intx,boolopt){// 是否继承for(autoy:v[x]){if(y!=fa[x]&&y!=son[x]){solve(y,0);ans[x]=max(ans[x],ans[y]);}}if(son[x]){solve(son[x],1);ans[x]=max(ans[x],ans[son[x]]);}for(autoy:v[x]){if(y==son[x])continue;for(inti=dfn[y];i<=dfn[y]+siz[y]-1;i++)Getans(rnk[i],x);for(inti=dfn[y];i<=dfn[y]+siz[y]-1;i++)update(rnk[i]);}Getans(x,x);ans[x]=max(ans[x],now);update(x);if(opt==0){now=0;for(inti=dfn[x];i<=dfn[x]+siz[x]-1;i++)t[c[rnk[i]]]=-0x3f3f3f3f;}}/*~~~~~~~~~~~~~~~~~~~~ Boundary Line ~~~~~~~~~~~~~~~~~~~~*/signedmain(){cin>>n;for(inti=2;i<=n;i++){cin>>fa[i];v[fa[i]].push_back(i);charch;cin>>ch;c[i]=(1<<(ch-'a'));}memset(t,-0x3f,sizeoft);build(1);solve(1,0);for(inti=1;i<=n;i++)cout<<ans[i]<<' ';return0;}