洛谷p3375kmp问题求解,为什么会这样

洛谷p3375,kmp字符串匹配问题

#include<bits/stdc++.h>
using namespace std;

char s1[1000010],s2[1000010];
int ans[1000010];

void prefix_table(char pattern[],int prefix[],int n) //求pattern的前缀表;
{                                                    //prefix用来储存pattern的前缀
    prefix[0]=0;                                     //n是prefix的个数
    int len=0;
    int i=1;
    while(i<n)
    {
        if(pattern[i]==pattern[len])
        {
            len++;
            prefix[i]=len;
            i++;
        }
        else
        {
            if(len>0)
            {
                len=prefix[len-1];
            }
            else
            {
                prefix[i]=len;
                i++;
            }
        }
    }
}
void move_prefix_table(int prefix[],int n) //移动 prefix字符串 函数
{
    int i;
    for(i=n-1;i>0;i--)
    {
        prefix[i]=prefix[i-1];
    }
    prefix[0]=-1;                           //把prefix的前缀数组整体向后移动一位
}                                           //并在第一位补上-1
void kmp(char text[],char pattern[])        //kmp匹配函数,
{                                           //用 pattern 对 text 进行匹配
    int i=0,j=0,m,n;
    n=strlen(pattern);
    m=strlen(text);
    int *prefix=(int*)malloc(sizeof(n));    //定义前缀表prefix为动态数组
    prefix_table(pattern,prefix,n);         //调用求取pattern的前缀表记录到prefix
    move_prefix_table(prefix,n);
    while(i<m)
    {
        if(j == n-1 && text[i] == pattern[j])
        {
            printf("%d\n",i - j + 1);  //匹配的位置
            j=prefix[j];
        }
        if(text[i] == pattern[j])
        {
            i++;
            j++;
        }
        else
        {
            j=prefix[j];
            if(j == -1)
            {
                i++;
                j++;
            }
        }
    }
}
int main()
{
    scanf("%s%s",s1,s2);
    kmp(s1,s2);
    int tem=strlen(s2);
    prefix_table(s2,ans,tem);
    for(int i=0;i<tem;i++)
    {
        printf("%d ",ans[i]);  //输出前缀表为ans
    }
    return 0;
}

为什么这个代码只能ac三个,后面全re??求解

卧槽,这么长!