【板子】KMP

//lg p3375
//Copyright yeyou26
#include<bits/stdc++.h>
using namespace std;

char p[1000005],s[1000005];
int lenp,lens;
int lst[1000005];

void init();
void pre_work();
void kmp();
void out_put();

int main()
{
    freopen("working.in","r",stdin);
    freopen("working.out","w",stdout);
    init();
    pre_work();
    kmp();
    out_put();
    return 0;
}

//Function Implementation

void init()
{
    cin>>(s+1)>>(p+1);
    lenp=strlen(p+1);
    lens=strlen(s+1);
}

void pre_work()
{
    lst[1]=0;
    for(int i=2,j=0;i<=lenp;i++)
    {
        while(j && p[j+1]!=p[i]) j=lst[j];
        if(p[j+1]==p[i]) j++;
        lst[i]=j;
    }
}

void kmp()
{
    for(int i=1,j=0;i<=lens;i++)
    {
        while(j && p[j+1]!=s[i]) j=lst[j];
        if(p[j+1]==s[i]) j++;
        if(j==lenp) printf("%d\n",i-j+1);
    }
}

void out_put()
{
    for(int i=1;i<=lenp;i++)
    {
        printf("%d ",lst[i]);
    }
}
posted @ 2024-01-26 20:54  yeyou26  阅读(3)  评论(0编辑  收藏  举报