#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=2e5+10,maxm=2e6+10;
int n,rt;
char s[maxn];
int b[maxn],c1[maxm],c2[maxm],d[maxn],fa[maxn],sz[maxn],mx[maxn],ans[maxn];
bool vis[maxn];
vector<int> g[maxn],a1,a2;
int pop(int x)
{
if(!x) return 0;
return pop(x/2)+x%2;
}
void get(int u,int f,int tp)
{
if(!tp) d[u]=d[f]+1;
sz[u]=1,mx[u]=0;
a1.push_back(u);
for(int i=0;i<g[u].size();i++)
{
int v=g[u][i];
if(v==f||vis[v]) continue;
get(v,u,tp);
if(!tp) fa[v]=u;
sz[u]+=sz[v];
mx[u]=max(mx[u],sz[v]);
}
}
void add(int x,int y,int z)
{
if(!z) return;
if(d[x]<d[y]) swap(x,y);
ans[x]+=z,ans[fa[y]]-=z;
}
void dfs1(int u,int f)
{
b[u]=b[f]^(1ll<<(s[u]-'a'));
a1.push_back(u),a2.push_back(u);
for(int i=0;i<g[u].size();i++)
{
int v=g[u][i];
if(v==f||vis[v]) continue;
dfs1(v,u);
}
}
void dfs2(int u,int f)
{
b[u]=0;
a2.clear();
for(int i=0;i<g[u].size();i++)
{
int v=g[u][i];
if(v==f||vis[v]) continue;
a1.clear();
dfs1(v,u);
for(int j=0;j<a1.size();j++)
{
int p=a1[j],w=c1[b[p]^(1ll<<(s[u]-'a'))];
add(u,p,w);
w=c2[b[p]];
add(v,p,w);
for(int k=0;k<20;k++)
{
w=c1[b[p]^(1ll<<(s[u]-'a'))^(1ll<<k)];
add(u,p,w);
w=c2[b[p]^(1ll<<k)];
add(v,p,w);
}
}
for(int j=0;j<a1.size();j++)
{
int p=a1[j];
c1[b[p]]++,c2[b[p]^(1ll<<(s[u]-'a'))]++;
}
}
for(int i=0;i<a2.size();i++)
{
int v=a2[i];
if(pop(b[v]^(1ll<<(s[u]-'a')))<=1) add(u,v,2);
c1[b[v]]=c2[b[v]^(1ll<<(s[u]-'a'))]=0;
}
a2.clear();
for(int i=g[u].size()-1;i>=0;i--)
{
int v=g[u][i];
if(v==f||vis[v]) continue;
a1.clear();
dfs1(v,u);
for(int j=0;j<a1.size();j++)
{
int p=a1[j],w=c1[b[p]^(1ll<<(s[u]-'a'))];
add(u,p,w);
w=c2[b[p]];
add(v,p,w);
for(int k=0;k<20;k++)
{
w=c1[b[p]^(1ll<<(s[u]-'a'))^(1ll<<k)];
add(u,p,w);
w=c2[b[p]^(1ll<<k)];
add(v,p,w);
}
}
for(int j=0;j<a1.size();j++)
{
int p=a1[j];
c1[b[p]]++,c2[b[p]^(1ll<<(s[u]-'a'))]++;
}
}
for(int i=0;i<a2.size();i++)
{
int v=a2[i];
c1[b[v]]=c2[b[v]^(1ll<<(s[u]-'a'))]=0;
}
vis[u]=1;
for(int i=0;i<g[u].size();i++)
{
int v=g[u][i];
if(v==f||vis[v]) continue;
a1.clear();
get(v,u,1);
for(int j=0;j<a1.size();j++)
{
int p=a1[j];
mx[p]=max(mx[p],sz[v]-sz[p]);
if(mx[p]<=sz[v]/2) rt=p;
}
dfs2(rt,0);
}
}
void dfs3(int u,int f)
{
for(int i=0;i<g[u].size();i++)
{
int v=g[u][i];
if(v==f) continue;
dfs3(v,u);
ans[u]+=ans[v];
}
}
signed main()
{
cin>>n;
for(int i=1;i<n;i++)
{
int u,v;
cin>>u>>v;
g[u].push_back(v);
g[v].push_back(u);
}
cin>>s+1;
a1.clear();
get(1,0,0);
for(int i=0;i<a1.size();i++)
{
int v=a1[i];
mx[v]=max(mx[v],n-sz[v]);
if(mx[v]<=n/2) rt=v;
}
dfs2(rt,0);
dfs3(1,0);
for(int i=1;i<=n;i++) cout<<ans[i]/2+1<<' ';
}
/*
6
1 2
2 3
3 4
4 5
4 6
abaaba
*/