题意:告诉你good字母,对于字符串s1*可以变成任意的非good 字符串; ? 可以变成任意的good字母;问给你s2,问是否能从s1变成s2;

思路:判断是否有*,分成2类,然后再分类讨论。
!!!不建议阅读我的代码!!!

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+500;
bool vis[500];
int main(void)
{
    memset(vis,false,sizeof(vis));
    char str[30];
    scanf("%s",str);
    int len=strlen(str);
    for(int i=0; i<len; i++)
    {
        vis[str[i]]=true;
    }
    char s[maxn];
    int flag=0;
    scanf("%s",s);
    len=strlen(s);
    for(int i=0; i<len; i++)
    {
        if(s[i]=='*')
        {
            flag=1;
            break;
        }
    }
    int n ;
    cin >> n;
    if(flag==0)
    {
        int f=0;
        for(int k=1; k<=n; k++)
        {
            char temp[maxn];
            scanf("%s",temp);
            int len1=strlen(temp);
            if(len!=len1)
            {
                printf("NO\n");
                continue;
            }
            int f=0;
            for(int i=0; i<len; i++)
            {
                if(s[i]=='?' && vis[temp[i]]==true)
                    continue;
                if(s[i]!=temp[i])
                {
                    f=1;
                    printf("NO\n");
                    break;
                }
            }
            if(f==0)    printf("YES\n");
        }
    }


    else if(flag==1)
    {
        for(int k=1; k<=n; k++)
        {
            char temp[maxn];
            scanf("%s",temp);
            int len1=strlen(temp);
            if(len1>len)
            {
                int dlen=len1-len;
                int i=0,j=0;
                int f=0;
                while(j<len1)
                {
                    if(s[i]=='?' && vis[temp[j]]==true) {i++,j++;continue;}
                    if(s[i]=='*')
                    {
                        for(;j<=i+dlen;++j)
                        {

                            if(vis[temp[j]]==true)
                            {
                                printf("NO\n");
                                f=1;
                                break;
                            }
                        }
                        j--;
                        if(f==0)    {i++,j++;continue;}
                    }
                    if(f==1) break;
                    if(s[i]!=temp[j])
                    {
                        f=1;
                        printf("NO\n");
                        break;
                    }i++,j++;
                }
                if(f==0)
                    printf("YES\n");
            }
            else if(len1==len)
            {
                int f=0;
                for(int i=0; i<len; i++)
                {
                    if(s[i]=='*' && vis[temp[i]]==false)   continue;
                    if(s[i]=='*' && vis[temp[i]]==true)
                    {
                        f=1;
                        printf("NO\n");
                        break;  
                    }
                    if(s[i]=='?' && vis[temp[i]]==true)
                        continue;
                    if(s[i]!=temp[i])
                    {
                        f=1;
                        printf("NO\n");
                        break;
                    }
                }
                if(f==0)    printf("YES\n");
            }
            else if(len1==len-1)
            {
                int i=0,j=0,f=0;
                while(j<len1)
                {
                    if(s[i]=='*')
                        i++;
                    if(s[i]=='?' && vis[temp[j]]==true)
                    {
                        i++,j++;
                        continue;
                    }
                    if(s[i]!=temp[j])
                    {
                        f=1;
                        printf("NO\n");
                        break;
                    }
                    i++,j++;
                }
                if(f==0)    printf("YES\n");
            }
            else if(len1 < len-1)
                printf("NO\n");
        }
    }
}

// 改了一个多小时的bug才改出来的。 自己的代码一手bug . 尴尬