开个二维数组记录,第一维是所在字符下标第二维是所有种类的字符,含义为该下标往后的第二维字符最早出现的下标,从后往前预处理,对于每个子串顺序遍历即可(类似于tire)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
int nex[100005][27];
int a[27];
char s[100005];
int main ()
{
int n,q;
scanf("%d%d",&n,&q);
scanf("%s",s+1);
for(int i=n;i>=0;--i)
{
for(int j=1;j<=26;++j)
nex[i][j]=a[j];
if(i)
a[s[i]-'a'+1]=i;
}
for(int i=1;i<=q;++i)
{
int t=0;
int f=0;
scanf("%s",s);
for(int j=nex[0][s[t]-'a'+1];s[t];++t,j=nex[j][s[t]-'a'+1])
{
if(j==0)
{
f=1;
break;
}
}
if(f)
{
printf("NO\n");
}
else printf("YES\n");
}
return 0;
}