/* 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],arb[N],lvl[N],T[N],n; void dfs(int x,int l,int p) { T[x]=p; lvl[x]=l; arb[x]=1; int best=0; 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,l+1,x); arb[x]+=arb[*it]; if(arb[*it]>arb[best]) best=*it; } if(!best) { ++nrl; P[nrl].pb(0); P[nrl].pb(x); poz[x]=1; lant[x]=nrl; return ; } lant[x]=lant[best]; P[lant[x]].pb(x); poz[x]=P[lant[x]].size()-1; } int sum(int x,int lit) { return S[lit][x]; } int lca(int x,int y) { while(1) { if(lant[x]==lant[y]) { if(lvl[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]; } } dfs(1,1,0); FOR(i,1,nrl) { int siz=P[i].size(); siz--; FOR(j,1,siz/2) swap(P[i][j],P[i][siz-j+1]); } FOR(i,1,m) { if(tip[i]==1) { int sol=0; if(i==8) { i++; i--; } 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<