#include <bits/stdc++.h>
const int Inf = 0x3f3f3f3f;
const int MN = 200005;
int N, a[MN];
std::vector<int> G[MN];
int par[MN], len[MN], gl[MN], f[MN], gf[MN];
void DFS0(int u, int p) {
  par[u] = p, f[u] = Inf;
  for (int v : G[u])
    if (v != p) {
      DFS0(v, u);
      len[u] = std::max(len[u], len[v] + 1);
      f[u] = std::min(f[u], f[v] + 1);
    }
  if (a[u]) f[u] = std::min(f[u], len[u]);
}
void DFS1(int u, int p) {
  static int seq[MN], pre[MN], suf[MN];
  int t = 0;
  for (int v : G[u])
    if (v != p) seq[++t] = v;
  pre[0] = suf[t + 1] = gl[u] + 1;
  for (int i = 1; i <= t; ++i) pre[i] = suf[i] = len[seq[i]] + 1;
  for (int i = 1; i <= t; ++i) pre[i] = std::max(pre[i], pre[i - 1]);
  for (int i = t; i >= 1; --i) suf[i] = std::max(suf[i], suf[i + 1]);
  for (int i = 1; i <= t; ++i) gl[seq[i]] = std::max(pre[i - 1], suf[i + 1]);
  pre[0] = suf[t + 1] = gf[u] + 1;
  for (int i = 1; i <= t; ++i) pre[i] = suf[i] = f[seq[i]] + 1;
  for (int i = 1; i <= t; ++i) pre[i] = std::min(pre[i], pre[i - 1]);
  for (int i = t; i >= 1; --i) suf[i] = std::min(suf[i], suf[i + 1]);
  for (int i = 1; i <= t; ++i) {
    gf[seq[i]] = std::min(pre[i - 1], suf[i + 1]);
    if (a[u]) gf[seq[i]] = std::min(gf[seq[i]], gl[seq[i]]);
  }
  for (int v : G[u])
    if (v != p) DFS1(v, u);
}
int lower[MN], upper[MN];
int main() {
  scanf("%d", &N);
  for (int i = 1, x, y; i < N; ++i) {
    scanf("%d%d", &x, &y);
    G[x].push_back(y);
    G[y].push_back(x);
  }
  for (int i = 1; i <= N; ++i) scanf("%1d", &a[i]);
  DFS0(1, 0), gl[1] = -1, gf[1] = Inf, DFS1(1, 0);
  for (int i = 1; i <= N; ++i) {
    int x = gl[i], y = -1;
    for (int v : G[i])
      if (v != par[i]) {
        if (len[v] > y) y = len[v];
        if (y > x) std::swap(x, y);
      }
    upper[i] = std::min(x, y + 2);
    if (!a[i]) lower[i] = std::min(f[i], gf[i] + 1);
  }
  long long Ans = 1;
  for (int i = 1; i <= N; ++i) Ans += std::max(upper[i] - lower[i] + 1, 0);
  printf("%lld\n", Ans);
  return 0;
}
