#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
int n;
ll res, dp[N][2];
char str[N];
vector<int> g[N];
void dfs(int x, int fa) {
if (str[x] == 'W') dp[x][0] = 1; //表示子树中无黑色路径数量
for (int to : g[x]) {
//遍历根为x的子树
if (to == fa) continue; //不回头
dfs(to, x);
if (str[x] == 'B') res += dp[x][0] * dp[to][0] + dp[to][0];
//之前走过的子树中的白色路径数量 乘以 新分支中的白色路径数量
else
res += dp[x][1] * dp[to][0] + dp[x][0] * dp[to][1];
//之前走过的子树中的黑色合法路径数量 乘以 新分支中白色路径数量
//加上镜像情况
dp[x][0] += dp[to][0]; //将新分支中情况统计计入本节点
dp[x][1] += dp[to][1];
}
if (str[x] == 'B') dp[x][1] = dp[x][0] + 1, dp[x][0] = 0;
//如果是黑色点,更新黑色点可行路径量
//而且黑色点不存在可行的白色点路径
}
int main() {
cin >> n;
scanf("%s", str + 1);
for (int i = 1, x, y; i < n; i++)
scanf("%d %d", &x, &y), g[x].push_back(y), g[y].push_back(x);
dfs(1, 1);
cout << res;
return 0;
}