模板——KMP

Posted lajioj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模板——KMP相关的知识,希望对你有一定的参考价值。

继续放。。。。

#include<stdio.h>
#include<cstring>
using namespace std;

const int MAXN = 1000005;
char a[MAXN];char b[MAXN];int next[MAXN];

int main(){
    scanf("%s%s",a,b);
    int lena = strlen(a);
    int lenb = strlen(b);
    int j=0,k=-1;next[0] = -1;
    while(j < lenb){
        if(k == -1 || b[j] == b[k]){
            j++;k++;
            next[j] = k;
        }
        else k = next[k];
    }
    j=0,k=0;
    while(j < lenb && k<lena){
        if(j == -1 || b[j] == a[k]){
            j++;k++;
        }
        else j = next[j];
        if(j == lenb){printf("%d
",k-lenb+1);j = next[j];}
    }
    for(int i=1;i<=lenb;++i) printf("%d ",next[i]);
    return 0;
}

顺便放个(Sunday)的板。。

#include<stdio.h>
#include<cstring>

using namespace std;

const int MAXN = 10000005;
char a[MAXN];char b[MAXN];int shift[30];

inline void sunday(){
    int lena = strlen(a+1);
    int lenb = strlen(b+1);
    
    for(int i=0;i<26;++i){
        shift[i] = lenb;
    }
    
    for(int i=1;i<=lenb;++i){
        shift[b[i] - 'a'] = lenb - i + 1;
    }
    
    int l1=1;
    int l2=1;
    int head=1;
    while(l1 <= lena - lenb + 1){
        l2 = 1;
        while(a[l1] == b[l2]){
            l1++;l2++;
            if(l2 > lenb){
                printf("%d
",l1 - l2 + 1);
                return ;
            }
        }
        if(head + lenb > lena) break;
        l1 += shift[a[head + lenb] - 'a'];
        head = l1;
    }
    puts("-1");return ;
}

int main(){
    scanf("%s%s",a+1,b+1);
    sunday();
    return 0;
}

以上是关于模板——KMP的主要内容,如果未能解决你的问题,请参考以下文章

扩展KMP模板

KMP算法模板

KMP模板

模板——kmp

KMP入门 博客推荐+模板+入门习题

模板KMP