Trie+dp

#include <bits/stdc++.h>
#define il inline
#define Max 2000005
using namespace std;
char p[Max];
int n,m,f[Max];
int e[233][27],v[233],cnt,len,ans;
il void ins(char *s)
{
    int u=0,l=strlen(s+1);
    len=max(len,l);
    for(int i=1;i<=l;i++)
    {
        int v=s[i]-'a';
        if(!e[u][v]) e[u][v]=++cnt;
        u=e[u][v];
    }
    //cout<<"qwq:"<<u<<endl;
    v[u]=1;
}
il bool find(int s,int t)
{
    int u=0;
    for(int i=s;i<=t;i++)
    {
        int v=p[i]-'a';
        if(!e[u][v]) return 0;
        u=e[u][v];
    }
    return v[u];
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        scanf("%s",p+1);
        ins(p);
    }
    for(int i=1;i<=m;i++)
    {
        scanf("%s",p+1);
        memset(f,0,sizeof(f));
        int l=strlen(p+1);
        ans=0;f[0]=1;
        for(int j=1;j<=l;j++)
        {
            for(int k=max(j-len,0);k<=j;k++)
            {
                //puts("qwq");
                //cout<<k+1<<' '<<j<<' '<<find(k+1,j)<<endl;
                if(f[k]&&find(k+1,j))
                {
                    f[j]=1;
                    ans=j;
                    break;
                }
            }
        }
        cout<<ans<<endl;
    }
}