func_code_string: #include <bits/stdc++.h>   using namespace std;   const int maxn = 200005;   int n, m;   char s[maxn];   long long ans[maxn];   int sz[maxn];   int cnt[1 << 20];   vector<int> g[maxn];   bool die[maxn];   int getsz(int x, int f) {     sz[x] = 1;     for (int y : g[x])       if (y != f && !die[y]) sz[x] += getsz(y, x);     return sz[x];   }   int getrt(int tot, int x, int f) {     for (int y : g[x])       if (y != f && !die[y])         if (sz[y] * 2 >= tot) return getrt(tot, y, x);     return x;   }   int h(int x) { return 1 << (s[x] -  a ); }   void update(int x, int f, int coe, int pre) {     cnt[pre ^= h(x)] += coe;     for (int y : g[x])       if (y != f && !die[y]) update(y, x, coe, pre);   }   long long query(int x, int f, int pre) {     long long pass = cnt[pre ^= h(x)];     for (int i = 0; i < 20; i++) pass += cnt[pre ^ (1 << i)];     for (int y : g[x])       if (y != f && !die[y]) pass += query(y, x, pre);     ans[x] += pass;     return pass;   }   void solve(int x) {     die[x] = 1;     update(x, 0, 1, h(x));     long long pass = cnt[h(x)];     for (int i = 0; i < 20; i++) pass += cnt[(1 << i) ^ h(x)];     for (int y : g[x])       if (!die[y]) {         update(y, x, -1, 0);         pass += query(y, x, h(x));         update(y, x, 1, 0);       }     update(x, 0, -1, h(x));     ans[x] += pass / 2 + 1;     for (int y : g[x])       if (!die[y]) solve(getrt(getsz(y, x), y, x));   }   int main() {     scanf( %d , &n);     for (int i = 1; i < n; i++) {       int u, v;       scanf( %d%d , &u, &v);       g[u].push_back(v);       g[v].push_back(u);     }     scanf( %s , s + 1);     solve(getrt(getsz(1, 0), 1, 0));     for (int i = 1; i <= n; i++) printf( %lld  , ans[i]);     return 0;   }   