KMP 初级板子 待更新

复杂度 O(n+m)

这个博主写的蛮不错的 http://www.cnblogs.com/SYCstudio/p/7194315.html

 

1.本文中,所有的字符串从0开始编号
2.为了在程序中表示方便,在接下来的说明中,next[i]=0表示最长相同前缀后缀长度为1,即真实的最长相同前缀后缀=next[i]+1。(重要的内容要放大)

 

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1010;
char A[maxn],B[maxn];//A为主串 B为模式串
int len1,len2;//len1为A的长度 同理
int next[maxn];
int ans;
//得到next 数组
void get_next()
{
    next[0] =-1;
    for(int i=1; i<len2 ;i++)
    {
        int j=next[i-1];
        while (B[j+1] != B[i] && j>=0)//不等就不断缩小长度 否则增加长度
            j = next[j];
        if(B[j+1] == B[i])
            next[i] =j+1;
        else
            next[i] =-1;
    }
}
//利用next数组寻找匹配,这里我们是每找到一个匹配就输出其开始的位置
int kmp()
{
    int i=0,j=0;
    while (i < len1)
    {
        if(A[i] == B[j])
        {
            i++;j++;
            if(j == len2)
            {
                printf("%d\n",i-len2);
                j=next[j-1]+1;
            }
        }
        else
        {
            if(j ==0)
                i++;
            else
                j= next[j-1]+1;
        }
    }
}

int main ()
{
    cin>>A>>B;
    len1=strlen(A),len2=strlen(B);
    get_next();
    kmp();
    //cout<< A[ans]<<endl;
}

 

posted @ 2017-08-21 15:17  Draymonder  阅读(139)  评论(0编辑  收藏  举报