红的一塌糊涂,求指正
  • 板块P9149 串串题
  • 楼主liverxiwo
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/5/28 13:05
  • 上次更新2024/5/28 17:41:49
查看原帖
红的一塌糊涂,求指正
1162380
liverxiwo楼主2024/5/28 13:05

rt,在理解性默写题解后自己打了一个,但是全wa,求各位dalao指点。

#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7,N=1e6+5;
int T,n,m,c,w,d,o,L,ans,a[N],b[N],p[N];
int nx[N],cnt[N],fct[N],inv[N],finv[N];
bool vis[N];
struct __KMP{
	inline int C(int x,int y){
        return y<0||x<y?0:1ll*fct[x]*finv[y]%mod*finv[x-y]%mod;
	    }
    inline void clear(){
	    c=o=L=ans=0;
	    a[n+1]=0;
	    b[m+1]=0;
	    for(int i=1;i<=w;i++){
		    cnt[i]=0;
		    vis[i]=0;
	    }  
    }
}liver_KMP;
signed main(){
	fct[0]=inv[0]=finv[0]=fct[1]=inv[1]=finv[1]=1;
	for(int i=2;i<N;i++){
		fct[i]=1ll*fct[i-1]*i%mod;
		inv[i]=(mod-1ll*mod/i*inv[mod%i]%mod)%mod;
		finv[i]=1ll*finv[i-1]*inv[i]%mod;
	}
	scanf("%lld",&T);
	while(T--){
		scanf("%lld%lld%lld%lld",&n,&m,&w,&d);
		liver_KMP.clear();
		for(int i=1;i<=n;i++){
			scanf("%lld",&a[i]);
		} 
		for(int i=1;i<=m;i++){
			scanf("%lld",&b[i]);
			vis[b[i]]=true;
		} 
		for(int i=1;i<=w;i++){
			if(!vis[i]){
				++c;
			} 
		} 
		for(int i=1;i<=n;i++){
			if(vis[a[i]]){
				p[++L]=i;
			} 
		} 
		for(int i=2,j=0;i<=m;i++){
			while(j&&b[i]!=b[j+1]){
				j=nx[j];
			} 
			if(b[i]==b[j+1]){
				++j;
				nx[i]=j;
			} 
		}
		for(int i=1,j=0,l=1,r=0;i<=L;i++){
			while(r<p[i]){
				++r;
				if(vis[a[r]]){
					continue;
				} 
				++cnt[a[r]];
				if(cnt[a[r]]==1){
					++o;
				} 
			}
			if(i>=m)
				while(l<p[i-m+1]){
					if(!vis[a[l]]){
						--cnt[a[l]];
						if(!cnt[a[l]]){
							--o;
						} 
					}
					l++;
				}
			while(j&&a[p[i]]!=b[j+1]){
				j=nx[j];
			} 
			if(a[p[i]]==b[j+1]){
				++j;
			} 
			if(j==m){
				ans=(ans+liver_KMP.C(c-o,d-o))%mod;
			} 
		}
		printf("%lld\n",ans);	
	}
	return 0;
}
2024/5/28 13:05
加载中...