#pragma GCC optimize("Ofast") #pragma GCC target("avx2") #define rd_init() char*rp=({char*mmap();mmap(0l,1l<<25,1,2,0,0ll);}) #define rd() ({int _v=0,_c;while(_c=*rp++-48,_c>=0)_v=_v*10+_c;_v;}) #define wt(v) {unsigned _z=v,_n=0;long _d=0;while(++_n,_d=_d<<8|0x30|_z%10,_z/=10);*(long*)wp=_d;wp+=_n;} #define rep(v,e) for(typeof(e) v=0;vcnt==0){ ep->cid=tn[j+1]++; } ep->cnt+=1; nid=ep->cid; } ++rp; } char*wp=wbuf; while(q--){ int t=*rp; rp+=2; if(t&1){ int k=rd(); int c=*rp-'a'; rp+=2; int d=*rp-'a'; rp+=2; rep(i,tn[k-1]){ struct N*np=&tree[k-1][i]; if(np->e[c].cnt){ if(np->e[d].cnt){ np->e[d].cnt+=np->e[c].cnt; maze(l,k,np->e[c].cid,np->e[d].cid); }else{ np->e[d]=np->e[c]; } np->e[c].cnt=0; } } }else{ int z=0; int nid=0; int k=0; for(int c;c=*rp++-'a',c>=0;){ z=tree[k][nid].e[c].cnt; if(!z){ while(*rp++-'a'>=0); break; } nid=tree[k][nid].e[c].cid; ++k; } wt(z); *wp++='\n'; } } write(1,wbuf,wp-wbuf); _exit(0); }