#include using namespace std; #define MAXN 200050 #define MAXLOGN 20 int N, M, a, b, t; string L; int f[MAXN][26]; vector A[MAXN]; int T[MAXN]; int lvl[MAXN]; int Q[MAXN][2]; int qs; int temp[26]; int dp[MAXLOGN][MAXN]; int maxk; void dfs(int node, int prv) { T[node] = prv; lvl[node] = prv == -1 ? 0 : lvl[prv] + 1; for (int i = 0; i < 26; i++) { f[node][i] = prv == -1 ? 0 : f[prv][i]; } f[node][ L[node] - 'a' ]++; for (int x : A[node]) { if (x != prv) { dfs(x, node); } } } int goKth(int x, int k) { for (int i = maxk; i >= 0; i--) { if (k & (1 << i)) { x = dp[i][x]; } } return x; } int lca(int x, int y) { if (lvl[x] < lvl[y]) { swap(x, y); } x = goKth(x, lvl[x] - lvl[y]); if (x == y) { return x; } for (int i = maxk; i >= 0; i--) { if (dp[i][x] != -1 && dp[i][y] != -1 && dp[i][x] != dp[i][y]) { x = dp[i][x]; y = dp[i][y]; } } return dp[0][x]; } int main() { // freopen("date.in", "r", stdin); // freopen("date.out","w", stdout); cin.sync_with_stdio(false); cin >> N >> M; cin >> L; for (int i = 0; i < N - 1; i++) { cin >> a >> b; a--; b--; A[a].push_back(b); A[b].push_back(a); } int x = -1; char c = -1; qs = 0; for (int i = 0; i < M; i++) { cin >> t; if (t == 1) { cin >> Q[qs][0] >> Q[qs][1]; Q[qs][0]--; Q[qs][1]--; qs++; } else { cin >> x >> c; x--; A[x].push_back(N); A[N].push_back(x); L += c; N++; } } dfs(0, -1); for (int i = 0; i < N; i++) { dp[0][i] = T[i]; } for (int j = 1; (1 << j) <= N; j++) { maxk = j; for (int i = 0; i < N; i++) { if (dp[j - 1][i] == -1) { dp[j][i] = -1; } else { dp[j][i] = dp[j - 1][ dp[j - 1][i] ]; } } } for (int i = 0; i < qs; i++) { a = Q[i][0]; b = Q[i][1]; int z = lca(a, b); for (int j = 0; j < 26; j++) { temp[j] = f[a][j] + f[b][j] - f[z][j]; } if (T[z] != -1) { z = T[z]; for (int j = 0; j < 26; j++) { temp[j] -= f[z][j]; } } int ans = 0; for (int j = 0; j < 26; j++) { if (temp[j] & 1) { ans++; } } cout << ans << '\n'; } return 0; }