#include using namespace std; #define rep(i,n) for (int i=0;i<(n);i++) #define rep2(i,a,b) for (int i=(a);i<(b);i++) #define rrep(i,n) for (int i=(n)-1;i>=0;i--) #define rrep2(i,a,b) for (int i=(b)-1;i>=(a);i--) #define all(a) (a).begin(),(a).end() typedef long long ll; typedef pair P; const ll mod = 1e9 + 7; int N; string s; vector> G; vector dfs(int now, int pre) { vector ret(3, 0); // w, ww, cwwの個数 for (auto nxt : G[now]) { if (nxt == pre) continue; auto child = dfs(nxt, now); rep(i, 3) ret[i] += child[i]; } if (s[now] == 'c') { // 自分がcなら、子のwwの数だけcwwが増える ret[2] += ret[1]; } else { // 自分がwなら、子のwの数だけwwが増える ret[1] += ret[0]; // wは1増える ret[0]++; } rep(i, 3) ret[i] %= mod; return ret; } signed main() { std::ios::sync_with_stdio(false); std::cin.tie(0); cin >> N; cin >> s; G.resize(N); rep(i, N - 1) { int a, b; cin >> a >> b; a--; b--; G[a].emplace_back(b); G[b].emplace_back(a); } // すべての c から木DP ll ans = 0; rep(i, N) { if (s[i] == 'c') { auto ret = dfs(i, -1); ans += ret[2]; ans %= mod; } } cout << ans << endl; }