#include #include #include typedef struct { int tata; int info; int mask; int level; } NODE; typedef struct lista { int v; struct lista *next; } LISTA; typedef struct query { int x, y; struct query *next; } QUERY; NODE nodes[100001]; LISTA *lista[100001]; QUERY *queries, *last; int n, m, t, x, y, p[100001], h = 0, root, vLca, tans, ans; char sir[100001]; LISTA* newNeightboar(int x, LISTA *next) { LISTA *node = (LISTA*)malloc(sizeof(LISTA)); node->v = x; node->next = next; return node; } void newQuery(int x, int y) { QUERY *q = (QUERY*)malloc(sizeof(QUERY)); q->x = x; q->y = y; q->next = 0; if(queries == NULL) { queries = last = q; } else { last->next = q; last = q; } } void computeP(int node, int l) { if(nodes[node].level < l) p[node] = root; else { if(!(nodes[node].level % l)) p[node] = nodes[node].tata; else p[node] = p[nodes[node].tata]; } LISTA *q = lista[node]; while(q) { computeP(q->v, l); q = q->next; } } int lca(int x, int y) { while(p[x] != p[y]) { if(nodes[x].level > nodes[y].level) x = p[x]; else y = p[y]; } while(x != y) if(nodes[x].level > nodes[y].level) x = nodes[x].tata; else y = nodes[y].tata; return x; } void masks(int node, int mask) { nodes[node].mask = mask ^ nodes[node].info; LISTA *q = lista[node]; while(q) { masks(q->v, nodes[node].mask); q = q->next; } } int main() { FILE *f = fopen("in.in", "r"); scanf("%d%d", &n, &m); scanf("%s", sir); for(int i = 0; i < n; ++i) { nodes[i + 1].info = 1 << (sir[i] - 97); } for(int i = 0; i < n - 1; ++i) { scanf("%d%d", &x, &y); nodes[y].tata = x; nodes[y].level = nodes[x].level + 1; if(nodes[y].level > h) h = nodes[y].level; lista[x] = newNeightboar(y, lista[x]); } root = 1; while(nodes[root].tata) root = nodes[root].tata; masks(root, 0); for(int i = 0; i < m; ++i) { scanf("%d", &t); if(t == 2) { scanf("%d%s", &x, sir); ++n; nodes[n].tata = x; nodes[n].info = (1 << (sir[0] - 97)); nodes[n].mask = nodes[x].mask ^ nodes[n].info; nodes[n].level = nodes[x].level + 1; lista[x] = newNeightboar(n, lista[x]); if(nodes[n].level > h) h = nodes[n].level; } else { scanf("%d%d", &x, &y); newQuery(x, y); } } computeP(root, sqrt(h)); while(queries) { ans = 0; vLca = lca(queries->x, queries->y); tans = nodes[queries->x].mask ^ nodes[queries->y].mask ^ nodes[vLca].info; while(tans) { if(tans & 1) ++ans; tans = tans >> 1; } printf("%d\n", ans); queries = queries->next; } }