KMP算法

一定注意读数据从1偏移开始

#include
using namespace std;
const int N = 1e6+5;
char a[N],b[N];
int nxt[N];

int main()
{
    scanf("%s%s", b+1, a+1);
    int n = strlen(a+1), m = strlen(b+1);
    for(int i=2, l=0; i<=n; i++)
    {
        while(l&&a[i]!=a[l+1]) l=nxt[l];
        if(a[i]==a[l+1]) l++;
        nxt[i] = l;
    }
    int no = 1;
    for(int i=1, l=0; i<=m; i++)
    {
        while(l&&b[i]!=a[l+1]) l=nxt[l];
        if(b[i]==a[l+1]) l++;
        if(l==n) no=0, printf("%d\n", i-l+1);
    }
    if(no) printf("NO");
}

你可能感兴趣的:(KMP算法)