题目链接:http://poj.org/problem?id=3461
大概意思就是标题那个意思,给样例数,给模式串,给主串,求模式串在主串出现的次数。数据量大,所以要用到KMP,然后简单变形下
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
char T[1000005],P[10005];
int next[10010],tn,pn,Case;
void Makenext(int tn){
int i=0,j=-1;
next[0] = -1;
while(i<tn){
if(j==-1||P[i]==P[j])
next[++i] = ++j;
else j = next[j];
}
}
int KMP(int pos,int N,int M){
int i = pos, j = 0,ans = 0;
while(i<N){
if(T[i]==P[j]||j==-1)i++,j++;
else j = next[j];
//KMP变形核心部分//
if(j==M){
ans++;
j = next[j-1];//这里用到的就是KMP笔记第二页开始的i和j移动规律以及next数组里面存放的意义
i--;//可能与next[0]和上面i++有关
}
}
return ans;
}
int main(){
scanf("%d",&Case);
while(Case--){
scanf("%s%s",P,T);
tn = strlen(T),pn = strlen(P);
Makenext(pn);
printf("%d\n",KMP(0,tn,pn));
}
return 0;
}
然后对于KMP的理解: