复杂度应该是对的单次询问线性那么为什么过不了呢
#include<bits/stdc++.h>
using namespace std;
struct trie
{
int son[26],end,fail,depth,C;
}Ac[1000001];
int cnt;
int n,m;
int fi[1000001],nx[1000001],to[1000001],tot;
string a,b;
void link(int a,int b)
{
nx[++tot]=fi[a];
fi[a]=tot;
to[tot]=b;
}
void Add(string a)
{
int now=0;
for(int i=0;i<a.length();i++)
{
if(!Ac[now].son[a[i]-'a'])
Ac[now].son[a[i]-'a']=++cnt,Ac[Ac[now].son[a[i]-'a']].depth=Ac[now].depth+1;
now=Ac[now].son[a[i]-'a'];
}
Ac[now].end=1;
}
void Getfail()
{
queue<int>que;
for(int i=0;i<26;i++)
if(Ac[0].son[i])
que.push(Ac[0].son[i]);
while(!que.empty())
{
int x=que.front();
que.pop();
for(int i=0;i<26;i++)
{
if(Ac[x].son[i])
Ac[Ac[x].son[i]].fail=Ac[Ac[x].fail].son[i],que.push(Ac[x].son[i]);
else
Ac[x].son[i]=Ac[Ac[x].fail].son[i];
}
}
}
void Dfs(int x,int fa)
{
if(Ac[x].end)
Ac[x].C|=(1<<(Ac[x].depth);
for(int i=fi[x];i;i=nx[i])
{
int v=to[i];
if(v!=fa)
Ac[v].C|=Ac[x].C,Dfs(v,x);
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a,Add(a);
Getfail();
for(int i=0;i<=cnt;i++)
link(Ac[i].fail,i);
Dfs(0,0);
for(int i=1;i<=m;i++)
{
int now=0,maxx=0,rr=1;
cin>>b;
for(int i=0;i<b.length();i++)
{
rr<<=1;
now=Ac[now].son[b[i]-'a'];
if(rr&Ac[now].C)
rr|=1,maxx=max(i+1,maxx);
}
cout<<maxx<<endl;
}
}