题意:
首先给出的是good字母,第二行为标准句s,第三行为匹配串的个数n,其后跟n个串。
'?'可被替换为good字母,'*'可被替换为任意非good字符(包括空格)。
问充分运用规则后两串是否匹配。
AC代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 const int maxn=1e5+10; 5 int good[200]; 6 char s[maxn],p[maxn],a[30]; 7 8 int main(){ 9 int n,pos=-1; 10 cin>>a; 11 int len=strlen(a); 12 for(int i=0;i<len;i++){ 13 good[a[i]]++; 14 } 15 cin>>s; 16 len=strlen(s); 17 for(int i=0;i<len;i++){ 18 if(s[i]=='*'){ 19 pos=i; 20 break; 21 } 22 } 23 cin>>n; 24 while(n--){ 25 int flag=1; 26 cin>>p; 27 int lenp=strlen(p); 28 if(pos==-1){ 29 if(len!=lenp){ 30 cout<<"NO"<<endl; 31 flag=0; 32 continue; 33 } 34 for(int i=0;i<lenp;i++){ 35 if(s[i]=='?'){ 36 if(good[p[i]]!=1){ 37 cout<<"NO"<<endl; 38 flag=0; 39 break; 40 } 41 } 42 else if(s[i]!=p[i]){ 43 cout<<"NO"<<endl; 44 flag=0; 45 break; 46 } 47 } 48 if(flag){ 49 cout<<"YES"<<endl; 50 } 51 } 52 else{ 53 if(len-lenp>=2){ 54 cout<<"NO"<<endl; 55 continue; 56 } 57 for(int i=0;i<pos;i++){ 58 if(s[i]=='?'){ 59 if(good[p[i]]!=1){ 60 cout<<"NO"<<endl; 61 flag=0; 62 break; 63 } 64 } 65 else if(s[i]!=p[i]){ 66 cout<<"NO"<<endl; 67 flag=0; 68 break; 69 } 70 } 71 if(!flag)continue; 72 int t=lenp-len+pos;//*替换的部分 73 for(int i=pos;i<=t;i++){ 74 if(good[p[i]]!=0){ 75 cout<<"NO"<<endl; 76 flag=0; 77 break; 78 } 79 } 80 if(!flag)continue; 81 for(int i=len-1,j=lenp-1;i>pos;i--,j--){ 82 if(s[i]=='?'){ 83 if(good[p[j]]!=1){ 84 cout<<"NO"<<endl; 85 flag=0; 86 break; 87 } 88 } 89 else if(s[i]!=p[j]){ 90 cout<<"NO"<<endl; 91 flag=0; 92 break; 93 } 94 } 95 if(flag) 96 cout<<"YES"<<endl; 97 } 98 } 99 return 0; 100 }