7-58-kmp模式匹配 【模板】KMP字符串匹配 (20分)

给出两个字符串text和pattern,其中pattern为text的子串,求出pattern在text中所有出现的位置。

为了减少骗分的情况,接下来还要输出子串的前缀数组next。

输入格式:
第一行为一个字符串,即为text。

第二行为一个字符串,即为pattern。

输出格式:
若干行,每行包含一个整数,表示pattern在text中出现的位置。

接下来1行,包括length(pattern)个整数,表示前缀数组next[i]的值,数据间以一个空格分隔,行尾无多余空格。

输入样例:
ABABABC
ABA

输出样例:
1
3
0 0 1

#include
#include

#define MAXN 1000005
int kmp[MAXN];

int s1,s2,j; 

char a[MAXN],b[MAXN],d;

int main()
{
    scanf("%s",a+1);
    scanf("%s",b+1);
    s1=strlen(a+1);
    s2=strlen(b+1);
    for (int i=2;i<=s2;i++){     
        while(j&&b[i]!=b[j+1]){
            j=kmp[j];
        }
        if(b[j+1]==b[i]){
            j++;
        }
        kmp[i]=j;
    }
    j=0;
    for(int i=1;i<=s1;i++){
        while(j>0&&b[j+1]!=a[i]){
            j=kmp[j];
        }
        if(b[j+1]==a[i]){
            j++;
        }
        if(j==s2){
            printf("%d\n",i-s2+1);
            j=kmp[j];
        }    
    }
    for(int i=1;i<=s2-1;i++){
        printf("%d ",kmp[i]);
    }
    printf("%d",kmp[s2]);
    return 0;
}

你可能感兴趣的:(7-58-kmp模式匹配 【模板】KMP字符串匹配 (20分))