[AC自动机][树状数组]luogu P2414 阿狸的打字机
https://www.luogu.org/problem/P2414 分析 容易发现询问串A属于串B多少次就是问访问串B时,跳完每个点的fail链,到达串A末尾的次数 可以发现如果把fail树建出来,就相当于每到达一个点,就往fail树里面权值+1,离开时-1,当到达串B末尾时,询问串A末尾在fail树中子树的权值和 用DFS序和树状数组可以轻松解决 #include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <algorithm> #define lowbit(x) x&-x using namespace std; const int N=2e5+10; struct Graph { int v,nx; }g[N]; int gcnt,list[N]; int fail[N],t[N][26],cnt,v[N]; struct Query { int x,y,id; }q[N]; int m,len,tme,p; int l[N],r[N],end[N],ans[N],f[N]; char c[N]; void Add(int u,int v) { g[++gcnt]=(Graph){v,list[u]};list[u]=gcnt; } bool CMP(Query a