#include <bits/stdc++.h>
using namespace std;
const int maxn = 200005;
int n;
vector<int> graf[maxn];
int color[maxn], rozm[maxn], best[maxn];
long long prop[maxn], res[maxn];
bool isCtr[maxn];
vector<pair<int, int> > maski[maxn];
long long ans;
int zlicz[2100000], os[2100000];
int lp;
inline void dodaj(int mask, bool co) {
  if (os[mask] != lp) {
    os[mask] = lp;
    zlicz[mask] = 0;
  }
  zlicz[mask] += (co ? 1 : -1);
}
inline int czytaj(int mask) {
  if (os[mask] != lp) {
    os[mask] = lp;
    zlicz[mask] = 0;
  }
  return zlicz[mask];
}
void dfs(int a, int oj) {
  rozm[a] = 1;
  best[a] = 0;
  for (auto v : graf[a]) {
    if (!isCtr[v] && v != oj) {
      dfs(v, a);
      rozm[a] += rozm[v];
      best[a] = max(best[a], rozm[v]);
    }
  }
}
void dfs2(int a, int oj, int& c, int size) {
  if (best[a] <= size / 2 && size - rozm[a] <= size / 2) {
    c = a;
    return;
  }
  for (auto v : graf[a]) {
    if (!isCtr[v] && v != oj) dfs2(v, a, c, size);
  }
}
int getCentr(int a) {
  dfs(a, -1);
  int cen;
  dfs2(a, -1, cen, rozm[a]);
  return cen;
}
void przejdz(int a, int oj, vector<pair<int, int> >& m, int mask) {
  prop[a] = 0;
  mask ^= (1 << color[a]);
  if (__builtin_popcount(mask) < 2) {
    prop[a]++;
    ans++;
  }
  m.push_back({a, mask});
  dodaj(mask, 1);
  for (auto v : graf[a]) {
    if (v != oj && !isCtr[v]) przejdz(v, a, m, mask);
  }
}
long long dfs3(int a, int oj) {
  long long wyn = prop[a];
  for (auto v : graf[a]) {
    if (!isCtr[v] && v != oj) wyn += dfs3(v, a);
  }
  res[a] += wyn;
  return wyn;
}
void oblicz(int a) {
  ans = 0;
  lp = a;
  int pom = 1 << color[a];
  for (auto v : graf[a]) {
    if (!isCtr[v]) {
      maski[v].clear();
      przejdz(v, a, maski[v], pom);
    }
  }
  res[a] += ans;
  ans = 0;
  for (auto v : graf[a]) {
    if (isCtr[v]) continue;
    for (auto x : maski[v]) dodaj(x.second, 0);
    for (auto x : maski[v]) {
      for (int i = 0; i <= 19; i++) {
        ans += czytaj(x.second ^ pom ^ (1 << i));
        prop[x.first] += czytaj(x.second ^ pom ^ (1 << i));
      }
      ans += czytaj(x.second ^ pom);
      prop[x.first] += czytaj(x.second ^ pom);
    }
    for (auto x : maski[v]) dodaj(x.second, 1);
  }
  for (auto v : graf[a]) {
    if (!isCtr[v]) dfs3(v, a);
  }
  res[a] += ans / 2;
}
void decomp(int a) {
  int ctr = getCentr(a);
  oblicz(ctr);
  isCtr[ctr] = true;
  for (auto v : graf[ctr]) {
    if (!isCtr[v]) decomp(v);
  }
}
int32_t main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> n;
  for (int i = 0; i < n - 1; i++) {
    int a, b;
    cin >> a >> b;
    graf[a].push_back(b);
    graf[b].push_back(a);
  }
  for (int i = 1; i <= n; i++) {
    char c;
    cin >> c;
    color[i] = c - 'a';
  }
  decomp(1);
  for (int i = 1; i <= n; i++) cout << res[i] + 1 << " ";
  cout << "\n";
  return 0;
}
