/* Keep It Simple! */ #include <fstream> #include <vector> #include <list> #include <stack> #include <string> #include <cmath> #include <queue> #include <vector> #include <algorithm> #include <cstring> using namespace std; #ifndef ONLINE_JUDGE ifstream cin("data.in"); ofstream cout("data.out"); #else #include<iostream> #endif // ONLINE_JUDGE #define ll long long #define mp make_pair #define fi first #define se second #define pb push_back typedef pair<int,int> pii; typedef pair<ll,ll> pll; const int kMaxN = 100005; int n,m; vector<int> G[kMaxN]; string letter,aux; int lvl[kMaxN]; int dad[kMaxN]; int seen[30]; void DFS(int node, int level,int father) { lvl[node] = level; dad[node] = father; for(int i = 0; i<G[node].size(); ++i) if(G[node][i] != father) DFS(G[node][i],level+1,node); } void LCA(int x, int y) { memset(seen, 0, sizeof(seen)); seen[letter[x-1]-'a'] = seen[letter[y-1]-'a'] = 1; while(x != y) { if(lvl[x] > lvl[y]) { x = dad[x]; ++seen[letter[x-1]-'a']; } else { y = dad[y]; ++seen[letter[y-1]-'a']; } } int ans = 0; for(int i=0; i<=('z'-'a'); ++i) if(seen[i]%2) ++ans; cout << ans+1 << '\n'; return; } void Solve() { cin >> n >> m >> letter; int x,y; for(int i=1; i<n; ++i) { cin >> x >> y; G[x].pb(y); G[y].pb(x); } DFS(1,0,0); int type; char meh; for(int i=1; i<=m; ++i) { cin >> type; if(type == 2) { cin >> x >> meh; letter.pb(meh); int deb = letter.size(); G[x].pb(letter.size()); G[letter.size()].pb(x); lvl[letter.size()] = lvl[x]+1; dad[letter.size()] = x; } else if(type == 1) { cin >> x >> y; LCA(x,y); } } } int main() { Solve(); return 0; }