30pts求调
查看原帖
30pts求调
536745
WaTleZero_pt楼主2024/3/30 22:02
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef __int128_t lll;
const ll Mod=99999999999973;
char mod[100010];
int cnt=1;
char l[12];
int tp[12];
ll p[12];
char str[100010];
int dp[12][100010];
int n,len;
ll hs[100010];
ll cf[100010];
ll ret(int l,int r){
	if(l==0) return hs[r];
	else return (hs[r]-hs[l-1]*(lll)cf[r-l+1]%Mod+Mod)%Mod;
}
void work(){
	scanf("%s",str+1);
	int slen=strlen(str+1);
//	hs[0]=str[0]-'a';
	for(int i=1;i<=slen;i++){
		hs[i]=(hs[i-1]*31+str[i]-'a')%Mod;
//		printf("%lld\n",hs[i]);
	} 
	memset(dp,0,sizeof(dp));
	dp[0][0]=1;
	for(int i=1;i<cnt;i++){
		for(int j=l[i];j<=slen;j++){
			if(dp[i-1][j-l[i]]==1&&ret(j-l[i]+1,j)==p[i])
				if(tp[i]==2) dp[i][j+1]|=dp[i-1][j-l[i]];
				else dp[i][j]|=dp[i-1][j-l[i]];
		}
//		printf("%d: \n",tp[i]);
		if(tp[i]==1){
			bool f=0;
			for(int j=0;j<=slen;j++){
				dp[i][j]|=f;
				f|=dp[i][j];
			}
		}
//		for(int j=0;j<slen;j++) printf("%d ",dp[i][j]);
//		printf("\n");
	}
	bool ok=0;
	for(int j=0;j<=slen;j++){
		if(dp[cnt-1][j]&&ret(j+1,slen)==p[cnt]) ok=1;
	}
	if(ok) printf("YES\n"); else printf("NO\n");
}
int main(){
	scanf("%s",mod);
	cf[0]=1;
	for(int i=1;i<=100005;i++) cf[i]=cf[i-1]*31%Mod;
	len=strlen(mod);
	for(int i=0;i<len;i++){
		if(mod[i]=='*'||mod[i]=='?') tp[cnt++]=mod[i]=='*'?1:2;
		else{
			l[cnt]++;
			p[cnt]=(p[cnt]*31+mod[i]-'a')%Mod;
		}
	}
	scanf("%d",&n);
	while(n--) work(); 
}/*
*a?bc*dde?*fg
10
aaabcfgddddemmmmmmmgggfg
*/
2024/3/30 22:02
加载中...