拍了20000+组数据了
代码大体思路是a按照∗分段
匹配时减掉?的hash值。
屎山代码:
#include<bits/stdc++.h>
#define int unsigned long long
using namespace std;
map<int,int> ha;
map<int,int> hb;
map<int,map<int,int> > tong;
char t=' ',b[100100],text[100100]={' ','a','a','?'},fw=' ',a[100100];
int len[100100],lmx,cnt=1,n,num;
unsigned long long mi[101000];
signed main(){
// freopen("in.in","r",stdin);
cin.tie(0);
cout.tie(0);
mi[0]=1;
for(int i=1;i<=100000;i++){
mi[i]=mi[i-1]*13331;
}
// for(int i=1;i<=3;i++){
while(1){
t=getchar();
a[++lmx]=t;
if(fw==' '){
fw=t;
}
// t=text[i];
if(t==10){
break;
}
if(t=='*'){
tong[cnt][0]=num;
num=0;
cnt++;
continue;
}
len[cnt]++;
if(t=='?'){
num++;
tong[cnt][num]=len[cnt];
ha[cnt]=ha[cnt]*13331;
continue;
}
ha[cnt]=ha[cnt]*13331+t;
}
tong[cnt][0]=num;
cin>>n;
// n=114;
for(int i=1;i<=n;i++){
cin>>b+1;
if(cnt==1){
if(fw=='*'){
cout<<"YES"<<endl;
continue;
}
int flag=1;
int zxc=strlen(b+1);
for(int i=1;i<=zxc;i++){
if(b[i]!=a[i]&&a[i]!='?'){
cout<<"NO"<<endl;
flag=0;
break;
}
}
if(flag){
cout<<"YES"<<endl;
}
continue;
}
// b[0]=' ';b[1]='a';b[2]='a';b[3]='a';
int cnt2=1;
int flag=1;
int zxc=strlen(b+1);
for(int j=1;j<=zxc;j++){
hb[j]=(hb[j-1]*13331+b[j]);
}int j=0;
for(;j<=zxc;j++){
if(cnt2-1>cnt){
flag=0;
}
if(!len[cnt2]&&j==0){
cnt2+=flag;
j--;
continue;
}
if(j+len[cnt2]>zxc){
// cout<<j;
break;
}
unsigned long long t=hb[j+len[cnt2]]-hb[j]*mi[len[cnt2]];
// cout<<j+len[cnt2]<<" "<<j<<" "<<t<<endl;
for(int i=1;i<=tong[cnt2][0];i++){
// cout<<len[cnt2]-(tong[cnt2][i])<<" "<<b[tong[cnt2][i]+j]<<endl;
t-=mi[len[cnt2]-(tong[cnt2][i])]*b[tong[cnt2][i]+j];
}
// cout<<t<<endl<<ha[cnt2]<<endl;
if(ha[cnt2]==t){
cnt2+=flag;
}
else if(j==0&&fw!='*'){
break;
}
}
// cout<<cnt2;
if(cnt2-1<=cnt||((j+len[cnt2])!=zxc+1)){
cout<<"NO"<<endl;
}
else{
cout<<"YES"<<endl;
}
}
// string fw;
// while(1){cin>>fw;}
return 0;
}
违规紫杉