//针对的是一个整数序列。
void makeNext(const int P[],int next[],int m){
int q=0;
memset(next,0,sizeof(next));
for(int i=1;i<m;i++){
if(q>0&&P[q]!=P[i])
q=next[q-1];
if(P[q]==P[i])
q++;
next[i]=q;
}
}
int kmp(const int a[],int n,const int P[],int m,int next[]){
makeNext(P,next,m);
for(int i=0,q=0;i<n;i++){
while(q>0&&P[q]!=a[i])
q=next[q-1];
if(P[q]==a[i])
q++;
if(q==m)
return i-q+1+1; //返回第一次和模板串匹配时的位置
}
return -1;
}
//针对的是字符串
void makeNext(const char P[],int next[]){
int m=strlen(P);
int k;
memset(next,0,sizeof(next));
for(int i=1,k=0;i<m;i++){
if(k>0&&P[k]!=P[i])
k=next[k-1];
if(P[k]==P[i])
k++;
next[i]=k;
}
}
int kmp(const char T[],const char P[],int next[]){
int ans=0;
makeNext(P,next);
int m=strlen(P);
int n=strlen(T);
for(int i=0,k=0;i<n;i++){
if(k>0&&P[k]!=T[i])
k=next[k-1];
if(P[k]==T[i])
k++;
if(k==m){
ans++; //统计模式串出现的次数
k=0;
}
}
return ans;
}