#include <bits/stdc++.h>
using namespace std;
const int MOD = 1e9 + 7;
const int SIZE = 3e5 + 10;
int v[SIZE];
int nxt[SIZE][26], sz[SIZE];
char s[SIZE];
vector<int> e[SIZE];
void merge(int x, int y, int &num) {
  for (int i = 0; i < (26); ++i) {
    if (nxt[y][i]) {
      if (!nxt[x][i]) {
        num += sz[nxt[y][i]];
        nxt[x][i] = nxt[y][i];
      } else {
        sz[x] -= sz[nxt[x][i]];
        merge(nxt[x][i], nxt[y][i], sz[nxt[x][i]]);
        sz[x] += sz[nxt[x][i]];
      }
    }
  }
}
void dfs(int x, int lt) {
  sz[x] = 1;
  for (int i = 0; i < (((int)(e[x]).size())); ++i) {
    int y = e[x][i];
    if (y == lt) continue;
    dfs(y, x);
    int c = s[y];
    if (!nxt[x][c]) {
      sz[x] += sz[y];
      nxt[x][c] = y;
    } else {
      sz[x] -= sz[nxt[x][c]];
      if (sz[nxt[x][c]] < sz[y]) {
        swap(y, nxt[x][c]);
      }
      merge(nxt[x][c], y, sz[nxt[x][c]]);
      sz[x] += sz[nxt[x][c]];
    }
  }
  v[x] += sz[x];
}
int main() {
  int(N);
  scanf("%d", &N);
  for (int i = 0; i < (N); ++i) scanf("%d", &(v[i]));
  scanf("%s", (s));
  for (int i = 0; i < (N); ++i) s[i] -= 'a';
  for (int i = (1); i < (N); ++i) {
    int x, y;
    scanf("%d%d", &x, &y);
    x--;
    y--;
    e[x].push_back(y);
    e[y].push_back(x);
  }
  dfs(0, 0);
  pair<int, int> an = make_pair(0, 0);
  for (int i = 0; i < (N); ++i) {
    if (an.first < v[i]) {
      an = make_pair(v[i], 1);
    } else if (an.first == v[i])
      an = make_pair(v[i], an.second + 1);
  }
  printf("%d\n%d\n", an.first, an.second);
  return 0;
}
