WA求调
  • 板块P9149 串串题
  • 楼主nnn233
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/6/25 17:16
  • 上次更新2024/6/25 20:51:33
查看原帖
WA求调
993065
nnn233楼主2024/6/25 17:16
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+50;
const int mod=1e9+7;
int t;
int n,m,w,d;
int a[N],b[N],c[N],ci[N];
int f[N],cnt,kmp[N],sum[N],res,W,ans;
int fct[N],inv[N],finv[N];
int C(int x,int y){//x个里选y个 
	return x>=y&&y>=0?fct[x]*finv[x-y]%mod*finv[y]%mod:0;
}
signed main(){
	fct[0]=inv[0]=finv[0]=fct[1]=inv[1]=finv[1]=1;
	for(int i=2;i<=1e6;i++){
		fct[i]=fct[i-1]*i%mod;
		inv[i]=(mod-mod/i*inv[mod%i]%mod)%mod;
		finv[N]=finv[i-1]*inv[i]%mod;
	}
	cin>>t;
	while(t--){
		res=cnt=ans=0;
		for(int i=1;i<=1e6+2;i++)a[i]=b[i]=c[i]=ci[i]=f[i]=kmp[i]=sum[i]=0;
		cin>>n>>m>>w>>d;
		W=w;
		for(int i=1;i<=n;i++)cin>>a[i];
		for(int i=1;i<=m;i++)cin>>b[i],f[b[i]]=1;
		for(int i=1;i<=w;i++)W-=f[i]; 
		for(int i=1;i<=n;i++)
			if(f[a[i]])c[++cnt]=a[i],ci[cnt]=i;
		int j=0;
		for(int i=2;i<=m;i++){
			while(j&&b[i]!=b[j+1])j=kmp[j];
			if(b[i]==b[j+1])j++;
			kmp[i]=j; 
		}
		j=0;
		int l=0,r=0;
		for(int i=1;i<=cnt;i++){
			while(j&&c[i]!=b[j+1])j=kmp[j];
			if(c[i]==b[j+1])j++;
			if(j==m){
				int s=ci[i-j+1]-1,e=ci[i];
				while(r<e){
					++r;
					if(!f[a[r]]){
						sum[a[r]]++;
						if(sum[a[r]]==1)res++;
					}
				}
				while(l<s){
					++l;
					if(!f[a[l]]){
						sum[a[l]]--;
						if(sum[a[l]]==0)res--;
					}
				}
				ans=(ans+C(W-res,d-res))%mod;
			}
		}
		cout<<ans<<"\n";
	}
	return 0;
}

2024/6/25 17:16
加载中...