func_code_string: #include <bits/stdc++.h>   using namespace std;   vector<int> g[200005];   int par[19][200005];   int depth[200005];   int dp[200005];   char s[200005];   void dfs(int u, int p, int d, int val) {     par[0][u] = p;     depth[u] = d;     dp[u] = val ^ (1 << (s[u] -  a ));     for (int i = 0; i < g[u].size(); i++) {       int v = g[u][i];       if (v == p) continue;       dfs(v, u, d + 1, dp[u]);     }   }   int LCA(int a, int b) {     if (depth[a] < depth[b]) swap(a, b);     int diff = depth[a] - depth[b];     for (int i = 18; i >= 0; i--) {       if ((diff >> i) & 1) a = par[i][a];     }     if (a == b) return a;     for (int i = 18; i >= 0; i--) {       if (par[i][a] != par[i][b]) a = par[i][a], b = par[i][b];     }     return par[0][a];   }   int dist(int a, int b) { return dp[a] ^ dp[b] ^ (1 << (s[LCA(a, b)] -  a )); }   int nn = 0;   int sub[200005];   bool vis[200005];   vector<pair<int, int> > edge[200005];   long long cnt[2000005];   long long ans[200005], add[200005];   void dfs1(int u, int p) {     sub[u] = 1;     nn++;     for (int i = 0; i < g[u].size(); i++) {       int v = g[u][i];       if (v == p || vis[v]) continue;       dfs1(v, u);       sub[u] += sub[v];     }   }   int dfs2(int u, int p) {     for (int i = 0; i < g[u].size(); i++) {       int v = g[u][i];       if (v == p || vis[v]) continue;       if (sub[v] > nn / 2) return dfs2(v, u);     }     return u;   }   void dfs3(int u, int p, int r, int idx) {     int bits = dist(u, r);     edge[idx].push_back(pair<int, int>(bits, u));     cnt[bits]++;     for (int i = 0; i < g[u].size(); i++) {       int v = g[u][i];       if (v == p || vis[v]) continue;       dfs3(v, u, r, idx);     }   }   void dfs4(int u, int p) {     for (int i = 0; i < g[u].size(); i++) {       int v = g[u][i];       if (v == p || vis[v]) continue;       dfs4(v, u);       add[u] += add[v];       add[v] = 0;     }     ans[u] += add[u];   }   void decompose(int u, int p) {     nn = 0;     dfs1(u, u);     int centroid = dfs2(u, u);     vis[centroid] = 1;     for (int i = 0; i < g[centroid].size(); i++) {       int v = g[centroid][i];       if (v == p || vis[v]) continue;       edge[i].clear();       dfs3(v, centroid, centroid, i);     }     for (int i = 0; i < g[centroid].size(); i++) {       int v = g[centroid][i];       if (v == p || vis[v]) continue;       for (int j = 0; j < edge[i].size(); j++) cnt[edge[i][j].first]--;       for (int j = 0; j < edge[i].size(); j++) {         int bits = edge[i][j].first;         int cur = edge[i][j].second;         int tot = __builtin_popcount(bits);         if (tot <= 1) add[centroid]++, add[cur]++;         add[cur] += cnt[bits ^ (1 << (s[centroid] -  a ))];         for (int j = 0; j < 20; j++) {           add[cur] += cnt[bits ^ (1 << j) ^ (1 << (s[centroid] -  a ))];         }       }       for (int j = 0; j < edge[i].size(); j++) cnt[edge[i][j].first]++;     }     for (int i = 0; i < g[centroid].size(); i++) {       int v = g[centroid][i];       if (v == p || vis[v]) continue;       for (int j = 0; j < edge[i].size(); j++) cnt[edge[i][j].first] = 0;     }     for (int i = 0; i < g[centroid].size(); i++) {       int v = g[centroid][i];       if (v == p || vis[v]) continue;       dfs4(v, centroid);       add[centroid] += add[v];       add[v] = 0;     }     ans[centroid] += add[centroid] / 2;     add[centroid] = 0;     for (int i = 0; i < g[centroid].size(); i++) {       int v = g[centroid][i];       if (v == p || vis[v]) continue;       decompose(v, centroid);     }   }   int main() {     int n;     scanf( %d , &n);     for (int i = 0; i < n - 1; i++) {       int a, b;       scanf( %d%d , &a, &b);       g[a].push_back(b);       g[b].push_back(a);     }     scanf( %s , s + 1);     dfs(1, 0, 0, 0);     for (int j = 1; j <= 18; j++) {       for (int i = 1; i <= n; i++) {         if (par[j - 1][i] != 0) par[j][i] = par[j - 1][par[j - 1][i]];       }     }     decompose(1, 0);     for (int i = 1; i <= n; i++) printf( %lld  , ans[i] + 1);   }   