https://vjudge.net/contest/170300#problem/C
char s[maxn];
int nxt[maxn];
int cnt[maxn];
int vis[maxn];
int main(){
int n,q;
sf("%d%d",&n,&q);
sf("%s",s);
int i,k=0;
for(i=1;i<n;++i){
while(k>0&&s[i]!=s[k])k=nxt[k-1];
if(s[i]==s[k])k++;
nxt[i]=k;
}
while(q--){
int op;sf("%d",&op);
if(op==1){
sf("%s",s+n);
n++;
while(k>0&s[i]!=s[k])k=nxt[k-1];
if(s[i]==s[k])k++;
nxt[i]=k;
cnt[++i]=cnt[k];//即是原来的 n+1, 反正就是那个位置的满足后缀数
}else if(op==2){
if(!vis[i]){
vis[i]=1;
cnt[i]++;
}
}else{
pf("%d\n",cnt[n]);
}
}
}