zoukankan      html  css  js  c++  java
  • 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
    */
  • 相关阅读:
    PAT B1027 打印沙漏 (20 分)
    PAT B1025 反转链表 (25 分)
    PAT B1022 D进制的A+B (20 分)
    PAT B1018 锤子剪刀布 (20 分)
    PAT B1017 A除以B (20 分)
    PAT B1015 德才论 (25 分)
    PAT B1013 数素数 (20 分)
    PAT B1010 一元多项式求导 (25 分)
    HDU 1405 The Last Practice
    HDU 1165 Eddy's research II
  • 原文地址:https://www.cnblogs.com/hhxj/p/7232230.html
Copyright © 2011-2022 走看看