写的树上差分,没暴力跳 fail,但不知道为啥一直WA 56pts(数据不能下也找不出来bug)
求神仙们捉虫
#include<bits/stdc++.h>
#define rep(i,a,b) for(ll i=(a);i<=(b);i++)
#define per(i,a,b) for(ll i=(a);i>=(b);i--)
#define Max(a,b) (a>b?a:b)
#define Min(a,b) (a<b?a:b)
#define next Cry_For_theMoon
#define il inline
typedef long long ll;
using namespace std;
const int MAXN=2e5+10,MAXM=2e6+10;
int n;
char s[MAXN],t[MAXM];
struct ACM{
int ch[MAXN][26],fail[MAXN],w[MAXN],pos[MAXN],vis[MAXN],tot;
queue<int>q;
void Insert(char* s,int idx){
int u=0;
for(int i=1;s[i];i++){
if(!ch[u][s[i]-'a'])ch[u][s[i]-'a']=++tot;
u=ch[u][s[i]-'a'];
}
pos[idx]=u;
}
void Build(){
while(q.size())q.pop();
rep(j,0,25)if(ch[0][j])q.push(ch[0][j]);
while(q.size()){
int u=q.front();q.pop();
rep(j,0,25){
if(ch[u][j])fail[ch[u][j]]=ch[fail[u]][j],q.push(ch[u][j]);
else ch[u][j]=ch[fail[u]][j];
}
}
}
void Query(char* s){
int u=0;
for(int i=1;s[i];i++){
u=ch[u][s[i]-'a'];
w[u]++;
}
}
void Solve(){
while(q.size())q.pop();
rep(i,1,tot)vis[fail[i]]=1;
rep(i,1,tot)if(!vis[i])q.push(i);
memset(vis,0,sizeof vis);
while(q.size()){
int u=q.front();q.pop();
if(vis[u])continue;
vis[u]=1;
w[fail[u]]+=w[u];if(fail[u])q.push(fail[u]);
}
rep(i,1,n){
printf("%d\n",w[pos[i]]);
}
}
}acm;
int main() {
scanf("%d",&n);
rep(i,1,n){
scanf("%s",s+1);
acm.Insert(s,i);
}
acm.Build();
scanf("%s",t+1);
acm.Query(t);
acm.Solve();
return 0;
}