#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <map>
#include <vector>
#include <stack>
#include <queue>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int maxn = 1e5+5;
const int inf = 0x3f3f3f3f;
const ll INF = 0x7f7f7f7f7f7f7f7f;
const int mod = 1e9+7;
char s[maxn];
int fa[maxn];
ll child[maxn],num[maxn],sum[maxn];
vector<int>vec[maxn];
vector<ll>tmp;
int fnd(int x)
{
if(x != fa[x])
return fnd(fa[x]);
return x;
}
void join(int x,int y)
{
if(child[x] > child[y])
{
fa[y] = x;
child[x] += child[y] + 1;
}
else
{
fa[x] = y;
child[y] += child[x] + 1;
}
}
ll solve()
{
ll res = 0;
for(int i=0; i<tmp.size(); i++)
{
res += tmp[i];
}
sum[0] = tmp[0];
for(int i=1; i<tmp.size(); i++)
{
sum[i] = sum[i-1] + tmp[i];
}
for(int i=1; i<tmp.size(); i++)
{
res += tmp[i]*sum[i-1];
}
return res;
}
int main()
{
int n;
scanf("%d%s",&n,s+1);
for(int i=1; i<=n; i++)
{
fa[i] = i;
}
for(int i=1; i<n; i++)
{
int u,v;
scanf("%d%d",&u,&v);
vec[u].push_back(v);
vec[v].push_back(u);
if(s[u] == 'W' && s[v] == 'W')
{
u = fnd(u),v = fnd(v);
if(u != v)
join(u,v);
}
}
for(int i=1; i<=n; i++)
{
num[i] = child[fa[i]] + 1;
}
ll ans = 0;
for(int i=1; i<=n; i++)
{
if(s[i] == 'B')
{
tmp.clear();
for(int j=0; j<vec[i].size(); j++)
{
if(s[vec[i][j]] == 'W')
tmp.push_back(num[vec[i][j]]);
}
ans += solve();
}
}
printf("%lld",ans);
}