#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; }