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
    */
  • 相关阅读:
    2019年6月英语四六级试题及答案和视频教程
    经典解压缩软件 WinRAR 5.90 sc 官方去广告版
    会动的边框
    萌萌达机器人
    背景图片跟随鼠标动
    烟花代码
    常用正则表达式
    计算器
    顶部下啦菜单
    ps用画笔工具设计水墨圆环
  • 原文地址:https://www.cnblogs.com/hhxj/p/7232230.html
Copyright © 2011-2022 走看看