RT,盯真一个下午了还是调不出来,求巨佬帮调
#include<bits/stdc++.h>
using namespace std;
const int MAXN=2000010;
const int N=100010;
struct Trie
{
int son[26],fail;
}tr[MAXN];
struct Edge
{
int nxt,to;
}e[MAXN];
int n,q,pos[N],cnte=1,head[MAXN],BIT[MAXN],tmp[MAXN],tot,ask,cnt=1;
int fa[MAXN],pdfn,siz[MAXN],dfn[MAXN],son[MAXN],top[MAXN],dep[MAXN];
int lowbit(int x){
return x&(-x);
}
int add(int x,int v)
{
for(;x<=cnt;x+=lowbit(x)) BIT[x]+=v;
}
int query(int x)
{
int res=0;
for(;x;x-=lowbit(x)) res+=BIT[x];
return res;
}
char s[MAXN];
inline void add_edge(int u,int v)
{
e[++cnte].nxt=head[u];
e[cnte].to=v;
head[u]=cnte;
return;
}
inline void insert(char *s,int x)
{
int p=1;
int len=strlen(s+1);
for(int i=1;i<=len;++i)
{
int ch=s[i]-'a';
if(!tr[p].son[ch]) tr[p].son[ch]=++cnt;
p=tr[p].son[ch];
}
pos[x]=p;
return;
}
inline void build()
{
queue<int>q;
for(int i=0;i<26;++i) tr[0].son[i]=1;
tr[1].fail=0;
q.push(1);
while(!q.empty())
{
int nw=q.front();
q.pop();
for(int i=0;i<26;++i)
{
if(tr[nw].son[i]) tr[tr[nw].son[i]].fail=tr[tr[nw].fail].son[i],q.push(tr[nw].son[i]);
else tr[nw].son[i]=tr[tr[nw].fail].son[i];
}
}
}
void dfs1(int u)
{
siz[u]=1;
int ma=0;
for(int i=head[u],v;~i;i=e[i].nxt)
{
v=e[i].to;
fa[v]=u,dep[v]=dep[u]+1;
dfs1(v);
siz[u]+=siz[v];
if(siz[v]>ma) ma=siz[v],son[u]=v;
}
return;
}
void dfs2(int u,int t)
{
top[u]=t;
dfn[u]=++pdfn;
if(son[u]) dfs2(son[u],t);
for(int i=head[u],v;~i;i=e[i].nxt)
{
v=e[i].to;
if(v!=son[u]) dfs2(v,v);
}
}
int LCA(int x,int y)
{
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]]) swap(x,y);
x=fa[top[x]];
}
return dep[x]<dep[y]?x:y;
}
bool cmp(int x,int y)
{
return dfn[x]<dfn[y];
}
int main()
{
scanf("%d",&n);
memset(head,-1,sizeof head);
for(int i=1;i<=n;++i)
{
scanf("%s",s+1);
insert(s,i);
}
scanf("%d",&q);
build();
for(int i=2;i<=cnt;++i) add_edge(tr[i].fail,i);
dep[1]=1;
dfs1(1);
dfs2(1,1);
while(q--)
{
int opt;
scanf("%d",&opt);
if(opt==1)
{
tot=0;
scanf("%s",s+1);
int len=strlen(s+1);
int p=1;
for(int i=1;i<=len;++i)
{
int ch=s[i]-'a';
p=tr[p].son[ch];
tmp[i]=p;
}
sort(tmp+1,tmp+len+1,cmp);
// len=unique(tmp+1,tmp+len+1)-tmp-1;
for(int i=1;i<=len;++i) add(dfn[tmp[i]],1);
for(int i=2;i<=len;++i) add(dfn[LCA(tmp[i],tmp[i-1])],-1);
}
else
{
scanf("%d",&ask);
int p=pos[ask];
printf("%d\n",query(dfn[p]+siz[p]-1)-query(dfn[p]-1));
}
}
return 0;
}