KMP算法

[亡魂溺海] 提交于 2019-11-27 05:39:03
#include<bits/stdc++.h>
using namespace std;
char A[1007],B[1007];
int P[1007],n,m;
void pre()
{
    P[1]=0;
    int j=0;
    for(int i=1;i<m;i++)
    {
        while(j>0 && B[j+1]!=B[i+1])
            j=P[j];
        if(B[j+1]==B[i+1])
            j++;
        P[i+1]=j;
    }
}
int kmp()
{
    int ans=0,j=0;
    for(int i=0;i<n;i++)
    {
        while(j>0 && B[j+1]!=A[i+1])
            j=P[j];
        if(B[j+1]==A[i+1])
            j++;
        if(j==m)
        {
            ans++;
            j=0;//手动移到子串头部,避免重复匹配
        }
    }
    return ans;    
}
int main()
{
    while(scanf("%s%s",A+1,B+1)==2)
    {
        m=strlen(B+1);
        n=strlen(A+1);
        pre();
        cout<<kmp()<<endl;
    }
    return 0;

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!