题意:
题意卡我一小时,很不友好,,,,
给你两个串,第一个串里面的字母都是good 字母,
第二个串是模式串,里面除了字母还有?和*(只有一个)
?可以替换所有good字母, *可以替换所有坏字母和空格(可以是多个坏字母!!!这点卡了我很久,也不举一个样例。。。)
然后q次询问,每次给你一个串,问你能否匹配成功,yes or no
题解:
强行模拟,按照规则一个一个匹配就行了,最后如果不能完全匹配就no。,。
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e5+10;
const int mod=1e9+7;
const ll inf=1e17;
char a[maxn],b[maxn],s[maxn];
int v[200];
int main(){
int q;
scanf("%s%s",a,b);
int n=strlen(a);
for(int i=0;i<n;++i)
v[a[i]]=1;
n=strlen(b);
scanf("%d",&q);
while(q--){
scanf("%s",s);
int len=strlen(s);
int o=len-n+1;
if(o<0) {
puts("NO");
continue;
}
int i=0,j=0,k;
while(i<n){
if(b[i]==s[j]){
i++;j++;
}else if(b[i]=='?'&&v[s[j]]){
i++;j++;
}else if(b[i]=='*'){
for(k=0;k<o&&j<len;++k,++j)
if(v[s[j]]) break;
if(k<o) break;
i++;
}else {
break;
}
}
if(i<n||j<len) puts("NO");
else puts("YES");
}
return 0;
}