测试点调进500ms,悬关
查看原帖
测试点调进500ms,悬关
557270
2021sunzishan楼主2025/7/25 20:08

希望把每个点都进500ms,大佬帮帮蒟蒻

#include<cstdio>
#include<cstring>
#define ll unsigned long long
#define N 100005
char c[N],c1[N];
int t,n,m,b=2333,mod=1e8+7,len[N];
ll s1[N],s[N],bs[N];
int cnt1[N],cnt=0;
bool f[N][15],cnt2[N];
bool cl(){
	for(int i=1;i<=n;i++)
		s1[i]=(s1[i-1]*b%mod+c1[i]-'a')%mod;
	f[0][0]=1;
	for(int i=1;i<=n;i++)
		for(int j=0;j<=cnt;j++){
			f[i][j]=0;
			if(i<len[j]+cnt1[j])continue;
			if(cnt2[j+1])f[i][j]=(f[i][j]||f[i-1][j]);
			if(j==0)continue;
			ll k=(s1[i]-s1[i-len[j]]*bs[len[j]]%mod+mod)%mod;
			if(k==s[j])
				f[i][j]=(f[i][j]||f[i-len[j]-cnt1[j]][j-1]);
		}
	if(n<cnt1[cnt+1])return 0;
	if(cnt2[cnt+1]){
		for(int i=n-cnt1[cnt+1];i>=1;i--)
			if(f[i][cnt])
				return 1;
		return 0;
	}
	return f[n-cnt1[cnt+1]][cnt];
}
main(){
	scanf("%s",c+1);
	m=strlen(c+1);
	bs[0]=1;
	for(int i=1;i<=m;i++)
		bs[i]=bs[i-1]*b%mod;
	scanf("%d",&t);
	int i=1;
	while(i<=m){
		cnt++;
		while(i<=m&&c[i]<'a'||c[i]>'z'){
			if(c[i]=='?')cnt1[cnt]++;
			if(c[i]=='*')cnt2[cnt]=1;
			i++;
		}
		while(i<=m&&c[i]>='a'&&c[i]<='z')
			s[cnt]=(s[cnt]*b%mod+c[i]-'a')%mod,i++,len[cnt]++;
	}
	if(c[m]<'a'||c[m]>'z')cnt--;
	while(t--){
		scanf("%s",c1+1);
		n=strlen(c1+1);
		if(cl())puts("YES");
		else puts("NO");
	}
	return 0;
}
2025/7/25 20:08
加载中...