您的位置:首页 > 其它

KMP模板

2017-07-29 14:30 239 查看
hdu 2087即一道模板题,这个没有什么要注意的,处理相关类型的题目一定要灵活运用f[i]的性质。(本人参考的是刘汝佳大神的写法,在蓝书上P212可以找到详细解释)

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAX=1004;
char T[MAX],W[MAX];
int n,m,f[MAX],sum;
void getfail(char *W) {
f[0]=f[1]=0;
for (int i=1;i<m;i++) {
int j=f[i];
while (j&&W[j]!=W[i]) j=f[j];
f[i+1]=W[i]==W[j]?j+1:0;
}
}
void kmp(char *T,char *W) {
getfail(W);
int j=0;
for (int i=0;i<n;i++) {
while (j&&T[i]!=W[j]) j=f[j];
if (T[i]==W[j]) j++;
if (j==m) sum++,j=0;
}
}
int main() {
while (scanf("%s%s",T,W)&&T[0]!='#') {
n=strlen(T),m=strlen(W),sum=0;
kmp(T,W);
printf("%d\n",sum);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  字符串