KMP(大成)


第一行为一个字符串,即为s1(仅包含大写字母)

第二行为一个字符串,即为s2(仅包含大写字母)

Output

若干行,每行包含一个整数,表示s2在s1中出现的位置

接下来1行,包括length(s2)个整数,表示前缀数组next[i]的值。

Sample Input

ABABABC
ABA

Sample Output

1
3
0 0 1



#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<string>
using namespace std;


const int maxN=1000001;
const int maxM=2001;
const int inf=2147493647;


int n,m;
string A,B;
int F[maxN];


int main()
{
    cin>>A>>B;
    n=A.size();;
    m=B.size();
    //Solve_Next
    
    F[0]=-1;
    
    for (int i=1;i<m;i++)
    {
        int j=F[i-1];
        while ((B[j+1]!=B[i])&&(j>=0))
            j=F[j];
        if (B[j+1]==B[i])
            F[i]=j+1;
        else
            F[i]=-1;
    }F[i]的值为 :该最长相同前缀后缀中的前缀的结束字符的数组位置(从0开始编号),如果要求最长相同前缀后缀的长度,要输出F[i]+1。
    
    //for (int i=0;i<m;i++)
    //    cout<<F[i]<<' ';
    //cout<<endl;
    
    int i=0,j=0;
    
    while (i<n)
    {
        if (A[i]==B[j])
        {
            i++;
            j++;
            if (j==m)
            {
                printf("%d\n",i-m+1);
                j=F[j-1]+1;
            }
        }
        else
        {
            if (j==0)
                i++;
            else
                j=F[j-1]+1;
        }
    }
    
    for (int i=0;i<m;i++)
        cout<<F[i]+1<<' ';//注意这里要+1
    cout<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/najiuzheyangbaacm/article/details/80214345
kmp
今日推荐