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;
}
全部评论

相关推荐

能干的三文鱼刷了100道题:公司可能有弄嵌入式需要会画pcb的需求,而且pcb能快速直观看出一个人某方面的实力。看看是否有面试资格。问你问题也能ai出来,pcb这东西能作假概率不高
点赞 评论 收藏
分享
Yki_:你要算时间成本呀,研究生两三年,博士三四年,加起来就五六年了,如果你本科去腾讯干五年,多领五年的年薪,加上公司内涨薪,可能到时候十五年总薪资也跟博士差不多
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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