KMP算法模板

#include<cstdio>
#include<cstring>

const int MAXN = 10000 + 10;

void KMP(char *pattern, char *source, int *f){
    //getfail
    int m = strlen(pattern) ,j;
    f[0] = f[1] = 0;
    for(int i = 1; i < m; ++i){
        j = f[i];
        while(j && pattern[i] != pattern[j]) j = f[j];
        f[i+1] = (pattern[i] == pattern[j] ? j + 1 : 0);
    }
    //run
    int n = strlen(source);
    j = 0;
    for(int i = 0; i < n; ++i){
        while(j && source[i] != pattern[j]) j = f[j];
        if(source[i] == pattern[j]) ++j;
        if(j == m) printf("Find at %d\n",i-m+1);
    }
    //print F
    for(int i=0;i<m;++i){
        if(i==0)printf("%d",f[i]);
        else printf(" %d", f[i]);
    }
}

void fcgets(char *data, int n){
    fgets(data, n, stdin);
    char *find = strchr(data, '\n');
    if(find) *find = '\0';
}
char s[MAXN], s2[MAXN];
int f[MAXN];
int main(){
    freopen("KMP.in", "r" ,stdin);
    fcgets(s, MAXN);
    fcgets(s2, MAXN);
    KMP(s2, s, f);
    return 0;
}
全部评论

相关推荐

每晚夜里独自颤抖:你cet6就cet6,cet4就cet4,你写个cet证书等是什么意思。专业技能快赶上项目行数,你做的这2个项目哪里能提现你有这么多技能呢
点赞 评论 收藏
分享
风中翠竹:真的真的真的没有kpi。。。面试官是没有任何kpi的,捞是真的想试试看这个行不行,碰碰运气,或者是面试官比较闲现在,没事捞个人看看。kpi算HR那边,但是只有你入职了,kpi才作数,面试是没有的。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务