#include #define ll long long #define INF 1000000005 #define MOD 1000000007 #define EPS 1e-10 #define rep(i,n) for(int i=0;i<(int)n;++i) #define each(a, b) for(auto (a): (b)) #define all(v) (v).begin(),(v).end() #define fi first #define se second #define pb push_back #define show(x) cout <<#x<<" = "<<(x)<P; const int MAX_N = 100005; string s; int alc,alw; vector G[MAX_N]; int memc[MAX_N],memw[MAX_N]; ll ans; void dfs(int u,int p) { if(G[u].size() == 1 && G[u][0] == p){ if(s[u] == 'c'){ memc[u] = 1; memw[u] = 0; }else{ memc[u] = 0; memw[u] = 1; } return; } if(memc[u] >= 0 && memw[u] >= 0){ return; } int smc = 0,smw = 0; rep(i,G[u].size()){ if(G[u][i] != p){ dfs(G[u][i],u); smc += memc[G[u][i]]; smw += memw[G[u][i]]; } } if(s[u] == 'c'){ memc[u] = smc+1; memw[u] = smw; }else{ memc[u] = smc; memw[u] = smw+1; int remc = alc - memc[u]; int remw = alw - memw[u]; rep(i,G[u].size()){ if(G[u][i] != p){ ans += (ll)memc[G[u][i]] * (alw-memw[G[u][i]]-1); }else{ ans += (ll)remc*(alw-remw-1); } } } } int main() { cin.tie(0); ios::sync_with_stdio(false); int n; cin >> n; cin >> s; rep(i,n){ if(s[i] == 'c'){ alc++; }else{ alw++; } } rep(i,n-1){ int a,b; cin >> a >> b; G[a-1].pb(b-1); G[b-1].pb(a-1); } rep(i,n){ memc[i] = memw[i] = -1; } dfs(0,-1); cout << ans << endl; return 0; }