题意:全字符集为‘a’..'z'。现给出一个名叫good的子集,其补集定义为bad,给出模式串s,其中s可能有多个‘?’(可以被替换成任何一个good字符),至多一个‘*’(可以被替换成任意长度的bad串,可以为空),然后给出q次询问,每次询问一个匹配串t能否和s匹配成功。
题解:双指针模拟一下。。。emmm确实这个思路以前都没有尝试过。。WA了这么多次也算学到了一些新东西。
Code:
#include<bits/stdc++.h>
using namespace std;
int main(){
string s;
cin>>s;
bool f[30]={0};
for(int b=0;b<s.length();b++){
f[(int)s[b]-96]=true;
}
string ss;
cin>>ss;
int n;
scanf("%d",&n);
while(n--){
string s1;
cin>>s1;
for(int b=0,b1=0;b<ss.length();b++,b1++){
if(ss[b]=='?'){
if(!f[s1[b1]-96]){
printf("NO\n");
break;
}
}else if(ss[b]=='*'){
int c=0;
while(!f[s1[b1]-96]&&b1<s1.length()&&c<s1.length()-ss.length()+1){
b1++;c++;
}
b1--;
}else if(ss[b]!=s1[b1]){
printf("NO\n");
break;
}
if(b==ss.length()-1)
if(b1==s1.length()-1){
printf("YES\n");
}
else printf("NO\n");
}
}
}