转化题目条件即可:
(a[i]+b[i])%k = (a[j]+b[j])%k
(b[i]-b[j])%k = (a[j]-a[i])%k(转化成了差分数组,第一项无用)
到这里就是正常kmp了
#include <bits/stdc++.h>
using namespace std;
void solve(){
int n,m,k;
cin>>n>>m>>k;
vector<int> a(n,0),b(m,0),A(n,0),B(m,0),nex(m,0);
for(int i=0;i<n;i++){
cin>>A[i];
if(i)a[i-1]=((A[i]-A[i-1]+k)%k+k)%k;//注意+k,为了使余数都为正;i的判断条件可以去掉首项,没用
}
for(int i=0;i<m;i++){
cin>>B[i];
if(i)b[i-1]=((B[i-1]-B[i])%k+k)%k;
}
//kmp算法
for(int i=1;i<m-1;i++){
int j=nex[i-1];
while(b[i]!=b[j]&&j>0)j=nex[j-1];
if(b[i]==b[j])j++;
nex[i]=j;
}
int j=0,sum=0;
for(int i=0;i<n-1;i++){
while(a[i]!=b[j]&&j>0)j=nex[j-1];
if(a[i]==b[j])j++;
if(j==m-1){
j=nex[j-1];
sum++;
}
}
cout<<sum<<'\n';
return;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int T=1;
cin>>T;
while(T--)solve();
return 0;
}