#define _USE_MATH_DEFINES #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; int main() { int n; string s; cin >> n >> s; vector > edges(n); for(int i=0; i> a >> b; -- a; -- b; edges[a].push_back(b); edges[b].push_back(a); } queue > q; stack > stk; q.push(make_pair(0, -1)); while(!q.empty()){ pair p = q.front(); q.pop(); stk.push(p); int curr = p.first; int prev = p.second; for(int next : edges[curr]){ if(next != prev) q.push(make_pair(next, curr)); } } int cSum = count(s.begin(), s.end(), 'c'); int wSum = n - cSum; vector cCnt(n, 0), wCnt(n, 0); long long ans = 0; while(!stk.empty()){ pair p = stk.top(); stk.pop(); int curr = p.first; int parent = p.second; for(int child : edges[curr]){ if(child != parent){ cCnt[curr] += cCnt[child]; wCnt[curr] += wCnt[child]; } } if(s[curr] == 'c'){ ++ cCnt[curr]; continue; } ++ wCnt[curr]; ans += (wCnt[curr] - 1LL) * (cSum - cCnt[curr]); for(int child : edges[curr]){ if(child != parent){ ans += cCnt[child] * (wSum - wCnt[child] - 1LL); } } } cout << ans << endl; return 0; }