#include #include #include #include #include #include #include #include #define maxdim 200005 using namespace std; int n, op; int S[26][maxdim], niv[maxdim], P[21][maxdim]; char letters[maxdim]; vector G[maxdim]; void dfs(int nod, int t) { ++S[letters[nod]-'a'][nod]; niv[nod] = niv[t]+1; for (int son : G[nod]) { if (son != t) { for (int i = 0; i < 26; ++i) { S[i][son] = S[i][nod]; } P[0][son] = nod; dfs(son, nod); } } } int lca(int x, int y) { if(niv[x] < niv[y]) swap(x, y); int log1, log2; for(log1 = 1; (1 << log1) < niv[x]; ++log1); for(log2 = 1; (1 << log2) < niv[y]; ++log2); for(int k = log1; k >= 0; --k) if(niv[x] - (1 << k) >= niv[y]) x = P[k][x]; if(x == y) return x; for(int k = log2; k >= 0; --k) if(P[k][x] && P[k][x] != P[k][y]) x = P[k][x], y = P[k][y]; return P[0][x]; } int main() { #ifndef ONLINE_JUDGE freopen("p.in", "r", stdin); freopen("p.out", "w", stdout); #endif scanf("%d %d\n%s", &n, &op, letters+1); for (int i = 1; i < n; ++i) { int x, y; scanf("%d %d", &x, &y); G[x].push_back(y); G[y].push_back(x); } dfs(1, 0); for (int p = 1; (1<