希望把每个点都进500ms,大佬帮帮蒟蒻
#include<cstdio>
#include<cstring>
#define ll unsigned long long
#define N 100005
char c[N],c1[N];
int t,n,m,b=2333,mod=1e8+7,len[N];
ll s1[N],s[N],bs[N];
int cnt1[N],cnt=0;
bool f[N][15],cnt2[N];
bool cl(){
for(int i=1;i<=n;i++)
s1[i]=(s1[i-1]*b%mod+c1[i]-'a')%mod;
f[0][0]=1;
for(int i=1;i<=n;i++)
for(int j=0;j<=cnt;j++){
f[i][j]=0;
if(i<len[j]+cnt1[j])continue;
if(cnt2[j+1])f[i][j]=(f[i][j]||f[i-1][j]);
if(j==0)continue;
ll k=(s1[i]-s1[i-len[j]]*bs[len[j]]%mod+mod)%mod;
if(k==s[j])
f[i][j]=(f[i][j]||f[i-len[j]-cnt1[j]][j-1]);
}
if(n<cnt1[cnt+1])return 0;
if(cnt2[cnt+1]){
for(int i=n-cnt1[cnt+1];i>=1;i--)
if(f[i][cnt])
return 1;
return 0;
}
return f[n-cnt1[cnt+1]][cnt];
}
main(){
scanf("%s",c+1);
m=strlen(c+1);
bs[0]=1;
for(int i=1;i<=m;i++)
bs[i]=bs[i-1]*b%mod;
scanf("%d",&t);
int i=1;
while(i<=m){
cnt++;
while(i<=m&&c[i]<'a'||c[i]>'z'){
if(c[i]=='?')cnt1[cnt]++;
if(c[i]=='*')cnt2[cnt]=1;
i++;
}
while(i<=m&&c[i]>='a'&&c[i]<='z')
s[cnt]=(s[cnt]*b%mod+c[i]-'a')%mod,i++,len[cnt]++;
}
if(c[m]<'a'||c[m]>'z')cnt--;
while(t--){
scanf("%s",c1+1);
n=strlen(c1+1);
if(cl())puts("YES");
else puts("NO");
}
return 0;
}