kmp

#include<cstdio>
#include<string.h>
using namespace std;
const int maxn=1e6+10;
char S[maxn];
char T[maxn];
int ls,lt;
int Next[maxn];//next[i] i始终指的是匹配上的一串后面那一个 
//next[i] 为T0~Ti-1 共i个字符,即为匹配长度 
void kmp(int pos)
{
    Next[0]=-1;
    int j=0,k=-1;
    while(j<lt)
    {
        if(k==-1||T[k]==T[j])
        {
            k++;j++;
            Next[j]=k;
        }
        else k=Next[k];
    }
    int i=pos;
    j=0;
    while(i<ls&&j<lt)
    {
        if(S[i]==T[j]||j==-1)//j==-1:next[0] 向前回退到了T0 此时没有前后缀 
            {i++;j++;}
        else
            j=Next[j];
        if(j==lt)
        {
            printf("%d\n",i-lt);//输出下标
            j=Next[j]; 
        }
    }
}
int main()
{
    scanf("%s",S);
    scanf("%s",T);
    ls=strlen(S);
    lt=strlen(T);
    kmp(0);
    for(int i=1;i<=lt;i++)
    printf("%d ",Next[i]);
    return 0;
}

只把这个下标从零开始的记熟

posted on 2022-04-23 22:42  衔白棋子的黑猫  阅读(58)  评论(0)    收藏  举报

导航