kmp水题~~
#include<iostream>
#include<cstdio>
#include<string>
#define N 50005
using namespace std;
int s[N],s1[N];
int nex[N];
void kmp(int n)
{
int k=-1;
nex[0]=-1;
for(int i=1;i<=n;++i )
{
if(s1[i]!=s1[k+1]&&k>=0) k=nex[k];
else if(s1[i]==s1[k+1]) k++;
nex[i]=k;
}
}
int match(int n,int m)
{
int i=-1;
int sum=0;
for(int j=0;j!=n;++j)
{
if(s[j]!=s1[i+1]&&i>=0) i=nex[i];
else if(s[j]==s1[i+1]) i++;
if(i==m-1) {sum++;i=nex[i];}
}return sum;
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
for(int i=0;i!=n;++i) scanf("%d",&s[i]);
for(int i=0;i!=m;++i) s1[i]=s[i];
memset(nex,-1,sizeof(nex));
kmp(m);
printf("%d\n",match(n,m)-1);
}return 0;
}