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;
}
}
最后一次更新于2021-09-28 02:19:12
0 条评论