#include<bits/stdc++.h> using namespace std; const int MAXN=2e5+5,MAXM=(1<<20)+5; int n; int a[MAXN]; vecotr v[MAXN]; bool vis[MAXN]; int num[MAXM]; int f[MAXN]; int sz[MAXN]; int ans[MAXN]; queue q; void init(){ memset(vis,false,sizeof(vis)); } int find(int d,int fa,int size){ sz[d]=1; int mx=0,now=0; for(int i=0;i<v[d].size();i++){ int tmp=v[d][i]; if(tmp==fa){ continue; } int tmp2=find(tmp,d,size); if(tmp2){ now=tmp2; } sz[d]+=sz[tmp]; mx=max(mx,sz[tmp]); } mx=max(mx,size-sz[d]); if(now){ return now; } if(mx<=size/2){ return d; } return 0; } void dfs(int d,int fa){ f[d]=f[fa]^(1<<a[d]);

} void solve(int d,int size){ vis[d]=true; int rt=find(d,0,size); dfs(rt,0); dfs2(rt,0); for(int i=0;i<v[d].size();i++){ int tmp=v[d][i]; if(vis[tmp]){ continue; } solve(tmp,sz[tmp]); } } int main(){ scanf("%d",&n); for(int i=1;i<n;i++){ int x,y; scanf("%d%d",&x,&y); v[x].push_back(y); v[y].push_back(x); } for(int i=1;i<=n;i++){ char x; scanf(" %c",&x); a[i]=x-'a'; } init(); solve(1,n); for(int i=1;i<=n;i++){ printf("%d\n",(ans[i]+num[i])/2+1); } }