一些板子

目录

kmp

#include<bits/stdc++.h>
#include<string>
using namespace std;
const int N=1000001;
int nex[N];
char a[N],b[N];//a使文本串,b使模式串
int lena,lenb;
void get_nex() {
    int j=0;
    for(int i=2; i<=lenb; ++i) {
        while(j && b[i]!=b[j+1]) j=nex[j];
        if(b[j+1]==b[i]) j++;
        nex[i]=j;
    }
}
void kmp() {
    int j=0;
    for(int i=1; i<=lena; ++i) {
        while(j && b[j+1]!=a[i]) j=nex[j];
        if(b[j+1]==a[i]) j++;
        if(j==lenb) {
            cout<<i-lenb+1<<'\n';
            j=nex[j];
        }
    }
}
int main() {
    cin>>a+1>>b+1;
    lena=strlen(a+1),lenb=strlen(b+1);
    get_nex();
    kmp();
    for(int i=1; i<=lenb; ++i) cout<<nex[i]<<" ";
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/pyyyyyy/p/11469341.html