方法1 字典树
#include<bits/stdc++.h>
#define ll long long
#define rll register long long
using namespace std;
ll n,m,sum;
string a;
int mark[1000005];
struct node
{
int son[26];
int mark;
} tree[1000006];
void add(string s)
{
ll p=0;
for(rll i=0;i<=s.size()-1;i++)
{
int now=s[i]-'a';
if(tree[p].son[now]==0) tree[p].son[now]=++sum;
p=tree[p].son[now];
}
tree[p].mark=1;
}
void querry(string s)
{
int ans,p=0;
memset(mark,0,sizeof(mark));
for(int i=0;i<=s.size();i++)
{
int now=s[i]-'a';
p=tree[p].son[now];
if(p==0) break;
if(tree[p].mark==1) mark[i]=1;
}
for(int i=0,k;i<=s.size()-1;i++)
{
if(!mark[i]) continue;
else ans=i+1;
p=0;
for(int j=i+1;j<=s.size()-1;j++)
{
int now=s[j]-'a';
p=tree[p].son[now];
if(p==0) break;
if(tree[p].mark==1) mark[j]=1;
}
}
printf("%d\n",ans);
}
int main()
{
freopen("l.in","r",stdin);
ios::sync_with_stdio(false);
cin>>n>>m;
//printf("%lld %lld\n",n,m);
for(int i=1;i<=n;i++)
{
cin>>a;//cout<<a<<endl;\
add(a);
}
for(int i=1;i<=m;i++)
{
cin>>a;//cout<<a<<endl;
querry(a);
}
return 0;
}
方法2 AC自动机