kmp入门 洛谷模板题

≡放荡痞女 提交于 2019-11-30 01:06:04
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+100;
char a[maxn],b[maxn];
int nexts[maxn];
int main()
{
    scanf("%s%s",b,a);
    int len1=strlen(a);
    nexts[0]=-1;
    for(int i=0,j=-1;i<=len1;)
    {
        if(j==-1||a[i]==a[j])nexts[++i]=++j;
        else j=nexts[j];
    }

    int len=strlen(b);
    int k=0;
    for(int i=0;i<len;i++)
    {
        while(k&&b[i]!=a[k])k=nexts[k];
        k+=a[k]==b[i]?1:0;
        if(k==len1)printf("%d\n",i-len1+2);
    }
    for(int i=1;i<=len1;i++)cout<<nexts[i]<<' ';
    return 0;
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!