标签:get tar span com string 相同 code algo class
题目链接: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(暴力大法好)
标签:get tar span com string 相同 code algo class
原文地址:http://www.cnblogs.com/Leonard-/p/7237211.html