Petya and Exam CodeForces - 832B
原创
©著作权归作者所有:来自51CTO博客作者DeathYmz的原创作品,请联系作者获取转载授权,否则将追究法律责任
Petya and Exam
CodeForces - 832B
题意:给出a串,b串。a串中小写字母为规范字符,其他不是规范字符,给出n个串,问能否由b匹配。b中有?和* 。?只能用a串中规范的一个字符替代,*可以由多个或者0个非规范字符替代(注意:没在a中出现也是非规范字符也可以用)
not happy= =(读题错误一个多小时(还是太菜了))
#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
using namespace std;
const int maxn=100010;
char a[maxn],b[maxn],str[maxn];
char tb[maxn];
map<char,int>vis;
int main()
{
scanf("%s",a);
getchar();
scanf("%s",b);
getchar();
int lenb=strlen(b);
int lena=strlen(a);
int flag=-1;
for(int i=0;i<lenb;i++)
if(b[i]=='*') {flag=i;break;}
for(int i=0;i<lena;i++)
if(a[i]>='a'&&a[i]<='z')
vis[a[i]]=1;
int n;cin>>n;
while(n--)
{
scanf("%s",str);
int len=strlen(str);
int ans=0;
if(flag!=-1&&lenb-len>=2) ans=1;
if(flag==-1&&len!=lenb) ans=1;
if(ans){
printf("NO\n");
continue;
}
int cnt=0;
for(int i=0;i<lenb;i++)
{
if(str[i+cnt]!=b[i])
{
if(b[i]=='?'&&vis[str[i+cnt]]) continue;
if(b[i]=='*')
{
for(int j=i;j<=i+len-lenb;j++)
if(vis[str[j]]){
ans=1;break;
}
if(ans) break;
cnt=len-lenb;
}
else{
ans=1;break;
}
}
}
if(ans) printf("NO\n");
else printf("YES\n");
}
}