Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
38870 LYLAKIOIAKIOI 【BJ】T2 C++ 通过 100 317 MS 32836 KB 2961 2025-11-10 19:18:28

Tests(48/48):


#include<bits/stdc++.h> #define ll long long #define i128 __int128_t using namespace std; const int N=1e5+10,g=3,mod=998244353; int n,k; int a[N<<1],b[N<<1],fac[N],inv[N]; int fail[N<<3],num[N<<3],len=0; void kmp(){ fail[0]=0;fail[1]=0; for(int i=2;i<=len;i++){ fail[i]=0;int now=i-1; do{ now=fail[now]; if(num[now+1]==num[i]){ fail[i]=now+1;break; } }while(now); } } #define poly vector<int> int lb(int x){return x&(-x);} void Add(int &a,int b){a+=b;if(a>=mod) a-=mod;} void Sub(int &a,int b){a-=b;if(a<0) a+=mod;} int qp(int a,int b){ int x=1; while(b){ if(b&1) x=1ll*x*a%mod; b>>=1;a=1ll*a*a%mod; }return x; } poly NTT(poly a,int op){ int len=a.size(); vector<int> rev;rev.resize(len); rev[0]=0;for(int i=1;i<len;i++) rev[i]=rev[i-lb(i)]+len/2/lb(i); poly b;b.resize(len);for(int i=0;i<len;i++) b[rev[i]]=a[i]; for(int le=2;le<=len;le<<=1){ int q=(op==1)?qp(g,(mod-1)/le):qp(g,(mod-1)-(mod-1)/le); for(int st=0;st<len;st+=le){ int pw=1; for(int p=0;p<le/2;p++){ int vl=(b[st+p]+1ll*pw*b[st+p+le/2])%mod; int vr=(b[st+p]+1ll*(mod-pw)*b[st+p+le/2])%mod; b[st+p]=vl,b[st+p+le/2]=vr; pw=1ll*pw*q%mod; } } } if(op==-1){ int iv=qp(len,mod-2); for(int i=0;i<len;i++) b[i]=1ll*b[i]*iv%mod; }return b; } poly mul(poly a,poly b){ int sz=a.size()+b.size()-1,len=1;while(len<sz) len<<=1; while(a.size()<len) a.push_back(0); while(b.size()<len) b.push_back(0); a=NTT(a,1);b=NTT(b,1); for(int i=0;i<len;i++) a[i]=1ll*a[i]*b[i]%mod; a=NTT(a,-1); //for(int i=0;i<len;i++) cout<<a[i]<<' ';cout<<endl; return a; } int main(){ //freopen("rail.in","r",stdin); //freopen("rail.out","w",stdout); cin>>n>>k; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=n;i++) cin>>b[i]; if(k>=n-1){ cout<<0<<endl; return 0; } for(int i=1;i<=n;i++) b[i+n]=b[i]; fac[0]=1;for(int i=1;i<=n;i++) fac[i]=1ll*i*fac[i-1]%mod; inv[n]=qp(fac[n],mod-2);for(int i=n-1;i>=0;i--) inv[i]=1ll*(i+1)*inv[i+1]%mod; poly A,B,C; for(int i=0;i<=2*n;i++) A.push_back(a[i]),B.push_back(b[i]); for(int i=0;i<=k+1;i++){ int res=1ll*fac[k+1]*inv[i]%mod*inv[k+1-i]%mod; if(i&1) res=(mod-res)%mod;C.push_back(res); } poly na=mul(A,C),nb=mul(B,C); for(int i=0;i<=2*n;i++) a[i]=na[i],b[i]=nb[i]; int stp=k+2,lena=n-stp+1; for(int i=stp;i<=n;i++) num[++len]=a[i]; num[++len]=-1; for(int i=stp;i<=2*n;i++) num[++len]=b[i]; kmp(); for(int i=1;i<=n;i++){ if(fail[i+lena+lena]==lena){ cout<<i-1<<endl; return 0; } }cout<<-1<<endl; return 0; }


测评信息: