/* Look at me! Look at me! Look at how large the monster inside me has become! */ #include #include #include #include #include #define FIT(a,b) for(vector::iterator a=b.begin();a!=b.end();a++) #define FITP(a,b) for(vector >::iterator a=b.begin();a!=b.end();a++) #define RIT(a,b) for(vector::reverse_iterator a=b.end();a!=b.begin();++a) #include #define ROF(a,b,c) for(int a=b;a>=c;--a) #include #include #define FOR(a,b,c) for(int a=b;a<=c;++a) #define REP(a,b) for(register int a=0;a #include #include #include #include #include #define f cin #define g cout #include #define debug cerr<<"OK"; #define pii pair #define mp make_pair #define pb push_back #define fi first #define se second #define ll long long #define ull unsigned long long #define mod 1000000009LL #define SQR 350 #define inf 1<<30 #define div fdasfasd #define hash dsafdsfds #define od 666013 #define mod 1000000007 #define DIM 600100 #define N 2001 using namespace std; /* int dx[]={0,0,0,1,-1}; int dy[]={0,1,-1,0,0}; */ vector v[N]; vector P[N]; char s[N],ch; int S[30][N],tip[N],a[N],b[N],m,nrl,x,y,poz[N],lant[N],subarb[N],niv[N],T[N],n; void dfs(int x,int lvl,int p) { niv[x]=lvl; T[x]=p; subarb[x]=1; FOR(lit,1,26) S[lit][x]=S[lit][p]; S[s[x]-'a'+1][x]++; FIT(it,v[x]) if(*it!=p) { dfs(*it,lvl+1,x); subarb[x]+=subarb[*it]; } if(subarb[x]==1) { ++nrl; lant[x]=nrl; P[nrl].pb(0); P[nrl].pb(x); return ; } int be=0; FIT(it,v[x]) if(*it!=p) { if(subarb[*it]>subarb[be]) be=*it; } lant[x]=lant[be]; P[lant[x]].pb(x); } int sum(int x,int lit) { return S[lit][x]; } int lca(int x,int y) { while(1) { if(lant[x]==lant[y]) { if(niv[x]>n>>m; f>>(s+1); FOR(i,1,n-1) { f>>x>>y; v[x].pb(y); v[y].pb(x); } FOR(i,1,m) { f>>tip[i]>>a[i]; if(tip[i]==2) { f>>ch; v[a[i]].pb(++n); v[n].pb(a[i]); s[n]=ch; } else { f>>b[i]; } } FOR(i,1,nrl) { int siz=P[i].size(); siz--; FOR(j,1,siz/2) swap(P[i][j],P[i][siz-j+1]); } dfs(1,1,0); FOR(i,1,m) { if(tip[i]==1) { int sol=0; int x=lca(a[i],b[i]); FOR(let,1,26) { if((sum(a[i],let)+sum(b[i],let)-sum(x,let)-sum(T[x],let))%2) sol++; } g<