struct ACM{ int ch[N][26],f[N],cnt[N]; int sz,rt; int ins(char *s){ int n=strlen(s),u=rt; for(int i=0;i<n;i++){ int c=s[i]-'a';S[tot++]=s[i]; if(!ch[u][c])ch[u][c]=++sz; u=ch[u][c]; } cnt[u]=1; return u; } void build(){ queue<int>q; while(!q.empty())q.pop(); int u=0; for(int c=0;c<26;c++){ int *v=&ch[rt][c]; if(*v) f[*v]=rt,q.push(*v); else *v=rt; } while(!q.empty()){ int u=q.front();q.pop(); for(int c=0;c<26;c++){ int *v=&ch[u][c]; if(*v){ f[*v]=ch[f[u]][c];q.push(*v); } else *v=ch[f[u]][c]; } } } void query(char *s){ int n=strlen(s),u=rt; for(int i=0;i<n;i++){ if(s[i]=='#'){ u=0;continue; } int c=s[i]-'a'; while(u&&!ch[u][c])u=f[u]; u=ch[u][c]; int v=u; while(v){ if(cnt[v])cnt[v]++; v=f[v]; } } } }Aho;