首页 > 代码库 > Codeforces Round #425 (Div. 2) B. Petya and Exam(暴力大法好)

Codeforces Round #425 (Div. 2) B. Petya and Exam(暴力大法好)

题目链接:http://codeforces.com/problemset/problem/832/B

题意:给定一些小写字符(定义为好字符,除这些好字符外的其他小写字符都是坏字符)。和字符串S,S里面除了小写字母以外还有?字符,?可以用任何的好字符替代;*字符,*只可以用坏字符串

替代,然后给出n个字符串去匹配S字符,问是否能成功。

题解:QAQ,这道题写的我头发又掉了好多。

设拿来匹配S的字符串为T

字符串要匹配,长度要相同吧。*既然这么强大,可以空,那么T的长度最多比S的长度少1;然后不管T长度有多少,只要*符号存在的位置合理,那么就可能匹配。

然后就是匹配了,两个方向 向*位置走在,在这个过程中要保证?的时候T的都是好字符,不是?的时候两者相同。然后就是*代表的那串字符串里面都要是坏字符,

判断一下就可以了。

 1 #include <iostream> 2 #include <cstring> 3 #include <algorithm> 4 using namespace std; 5  6 int num[30]; 7  8 int main(){ 9     ios_base::sync_with_stdio(false);10     int n;11     string S,T,Q;12     cin>>T>>S;13     cin>>n;14     memset(num,0,sizeof(num));15     for(int i=0;i<T.size();i++) num[T[i]-96]=1;16     int Slen=S.size(),flag=0;17     for(int i=0;i<Slen;i++) if(S[i]==*) flag=1; 18     19     for(int k=0;k<n;k++){20         cin>>Q;21         int idx=1,Qlen=Q.size();22         23         if(Qlen<Slen-flag) {cout<<"NO"<<endl;continue;}24         if(Qlen!=Slen&&!flag) {cout<<"NO"<<endl;continue;}25         26         int s=0,t=1;27         while(S[s]!=*&&s<Slen&&idx){28             if(S[s]==?&&num[Q[s]-96]==0) idx=0;29             else if(S[s]!=?&&S[s]!=Q[s]) idx=0;30             s++;    31         }32         33         while(S[Slen-t]!=*&&idx&&Slen-t>=0&&Qlen-t>=0){34             if(S[Slen-t]==?&&num[Q[Qlen-t]-96]==0) idx=0;35             else if(S[Slen-t]!=?&&S[Slen-t]!=Q[Qlen-t]) idx=0;36             t++;37         }38         39         for(int i=s;i<=Qlen-t&&flag;i++){40             if(num[Q[i]-96]==1)41             idx=0;42         }43         if(idx) cout<<"YES"<<endl;44         else cout<<"NO"<<endl;45     }46     47     return 0;48 }

 

Codeforces Round #425 (Div. 2) B. Petya and Exam(暴力大法好)