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;
}