训练指南p211
int f[1000006];
// 建立失配函数 p为模板串
void getfail(char *p){
int m=strlen(p);
f[0]=0;f[1]=0;
for(int i=1;i<m;i++){
int j=f[i];
while(j&&p[i]!=p[j]) j=f[j];
f[i+1]=p[i]==p[j]?j+1:0;
}
}
//t为要匹配的字符串 p为模版串
int kmp(char *t,char *p){
int n=strlen(t),m=strlen(p);
getfail(p);
int j=0;
int ans=0;
for(int i=0;i<n;i++){
while(j&&p[j]!=t[i]) j=f[j];
if(p[j]==t[i]) j++;
if(j==m) ans++;//找到了
}
return ans;
}