#include using namespace std; #define MAX_N 100005 typedef long long ll; int n; char s[MAX_N]; vector G[MAX_N]; int par[MAX_N]; ll wc[MAX_N]; ll cc[MAX_N]; void dfs(int pos,int prev){ if(s[pos]=='w')wc[pos]++; if(s[pos]=='c')cc[pos]++; par[pos]=prev; for(int i=0;i<(int)G[pos].size();i++){ int to=G[pos][i]; if(to==prev)continue; dfs(to,pos); wc[pos]+=wc[to]; cc[pos]+=cc[to]; } } ll mem[MAX_N]; ll ww(int pos){ if(mem[pos]!=-1)return mem[pos]; ll res=0; if(s[pos]=='w')res+= wc[pos]-1; for(int i=0;i<(int)G[pos].size();i++){ int to=G[pos][i]; if(to==par[pos])continue; res+=ww(to); } return mem[pos]=res; } ll Mem[MAX_N]; ll cw(int pos){ if(Mem[pos]!=-1)return Mem[pos]; ll res=0; if(s[pos]=='w') res+=cc[pos]; for(int i=0;i<(int)G[pos].size();i++){ int to=G[pos][i]; if(to==par[pos])continue; res+=cw(to); } return Mem[pos]=res; } ll cww(int pos){ ll res=0; if(s[pos]=='c'){ for(int i=0;i<(int)G[pos].size();i++){ int to=G[pos][i]; if(to==par[pos])continue; res+=ww(G[pos][i]); } }else if(s[pos]=='w'){ ll C=0,W=0; for(int i=0;i<(int)G[pos].size();i++){ int to=G[pos][i]; if(to==par[pos])continue; res+= C*wc[to]; res+= W*cc[to]; W+=wc[to]; C+=cc[to]; res+=cw(to); } } ll C=0,WW=0; ll CW=0,W=0; for(int i=0;i<(int)G[pos].size();i++){ int to=G[pos][i]; if(to==par[pos])continue; res+= cc[to]*WW; res+= ww(to)*C; res+= cw(to)*W; res+= wc[to]*CW; C+=cc[to]; W+=wc[to]; CW+=cw(to); WW+=ww(to); } return res; } int main(){ for(int i=0;i