#include <bits/stdc++.h>
using namespace std;
const int maxn = 200005;
int n, m;
char s[maxn];
long long ans[maxn];
int sz[maxn];
int cnt[1 << 20];
vector<int> g[maxn];
bool die[maxn];
int getsz(int x, int f) {
  sz[x] = 1;
  for (int y : g[x])
    if (y != f && !die[y]) sz[x] += getsz(y, x);
  return sz[x];
}
int getrt(int tot, int x, int f) {
  for (int y : g[x])
    if (y != f && !die[y])
      if (sz[y] * 2 >= tot) return getrt(tot, y, x);
  return x;
}
int h(int x) { return 1 << (s[x] - 'a'); }
void update(int x, int f, int coe, int pre) {
  cnt[pre ^= h(x)] += coe;
  for (int y : g[x])
    if (y != f && !die[y]) update(y, x, coe, pre);
}
long long query(int x, int f, int pre) {
  long long pass = cnt[pre ^= h(x)];
  for (int i = 0; i < 20; i++) pass += cnt[pre ^ (1 << i)];
  for (int y : g[x])
    if (y != f && !die[y]) pass += query(y, x, pre);
  ans[x] += pass;
  return pass;
}
void solve(int x) {
  die[x] = 1;
  update(x, 0, 1, h(x));
  long long pass = cnt[h(x)];
  for (int i = 0; i < 20; i++) pass += cnt[(1 << i) ^ h(x)];
  for (int y : g[x])
    if (!die[y]) {
      update(y, x, -1, 0);
      pass += query(y, x, h(x));
      update(y, x, 1, 0);
    }
  update(x, 0, -1, h(x));
  ans[x] += pass / 2 + 1;
  for (int y : g[x])
    if (!die[y]) solve(getrt(getsz(y, x), y, x));
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i < n; i++) {
    int u, v;
    scanf("%d%d", &u, &v);
    g[u].push_back(v);
    g[v].push_back(u);
  }
  scanf("%s", s + 1);
  solve(getrt(getsz(1, 0), 1, 0));
  for (int i = 1; i <= n; i++) printf("%lld ", ans[i]);
  return 0;
}
