Codeforces Round #425 (Div. 2)B. Petya and Exam

题意:先给出一行字符串,里面的字符都是好的字符,再给出一行字符B,B里面有小写字母,?,最多一个*,?可以代替很好的字母,*可以代替空格或者任意个坏的字母,问给出的字符串是否可以由B匹配

思路:我是先判断是否有*,没有就for,有的话就分2种情况,我用*和不用*,用*就是把*前面的字符串和*后面的字符串和它匹配,剩下来的就是可以用*来代替的,如果他全是坏的,就return  1,否则  return 0;

         (心态崩了,,,在寝室默默看代码发现少写了2个return 0,然后艰难的用手机改掉提交。。。WA19,早上起来的时候发现 有一个return 0,写错地方。。。嗨呀

        (附上辣鸡代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;

int b[30];
char s2[N];
string s1;
string s;
bool hh1(int x){//直接跳过
    int l=0,tt=0;
            for(int j=0;j<strlen(s2);j++){
                if(l>=s1.size()) {return 0;}
                if(l==x) {l++;j--;continue;}
                if(s2[j]!=s1[l]){
                    if(s1[l]=='?'){
                        if(b[s2[j]-'a']==0){
                           return 0;
                        }
                    }
                    else {return 0;}
                }
                l++;
            }
            if(l==s1.size()||(l==s1.size()-1&&s1[s1.size()-1]=='*'))
            return 1;
            else return 0;

}
bool hh2(int x){
     int l=0,r=strlen(s2)-1;
     for(int i=0;i<x;i++){
        if(l>=strlen(s2)) return 0;
        if(s2[l]!=s1[i]){
            if(s1[i]=='?'){
                if(b[s2[l]-'a']==0) return 0;
            }
            else return 0;//第1个return 0;
        }
        l++;
     }
     for(int i=s1.size()-1;i>x;i--){
            
        if(r<=0) return 0;
        if(s2[r]!=s1[i]){
            if(s1[i]=='?'){
                 if(b[s2[r]-'a']==0) return 0;
            }else  return 0;//第2个return 0
        }
        r--;
     }

     if(l>r) return 0;
     for(int i=l;i<=r;i++) {
        if(b[s2[i]-'a']==1) return 0;
     }
     return 1;
}
int main(){

    cin>>s;
    for(int i=0;i<s.size();i++){
        b[s[i]-'a']=1;
    }
    cin>>s1;int y=-1;
    int len=s1.size();
    for(int j=0;j<len;j++){
        if(s1[j]=='*') y=j;
    }
    int n;
    scanf("%d",&n);

    for(int i=1;i<=n;i++){
        scanf("%s",s2);
        if(y==-1){
            int l=0,tt=0;
            for(int j=0;j<strlen(s2);j++){
                if(l>s1.size()) {tt=1;break;}
                if(s2[j]!=s1[l]){
                    if(s1[l]=='?'){
                        if(b[s2[j]-'a']==0){
                            tt=1;break;
                        }
                    }
                    else {tt=1;break;}
                }
                l++;
            }
            if(l!=s1.size()||tt==1) {
                printf("NO
");
            }
            else printf("YES
");
        }
        else {
            if(hh1(y)){
                printf("YES
");continue;
            }
            if(hh2(y)){
                printf("YES
");continue;
            }
            printf("NO
");
        }
    }
}
/*
q
*b
2
cb
*/
原文地址:https://www.cnblogs.com/hhxj/p/7232230.html