KMP模板

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

/*************************KMP模板****************************/
int f[101];//优化后的失配指针,记住这里f要比P多一位,因为P到m-1即可,但是f还要计算出m的失配指针
int f2[101];//f2用来保存KM指针,是为优化f的失配指针,f保存的是优化之后的失配指针
char T[1000];//待匹配串
char P[100];//模板串
void getFail(char *P, int *f)
{
    int m = strlen(P);
    f[0] = f[1] = 0;
    f2[0]=f2[1]=0;
    for(int i = 1; i < m; i++)
    {
        int j = f2[i];
        while(j && P[i] != P[j] ) j = f2[j];
        f2[i+1] = f[i + 1] = (P[i] == P[j]) ? j + 1 : 0;

        //既然i+1的失配位置指向j+1,但是P[i+1]和P[j+1]的内容是相同的
        //所以就算指针从i+1跳到j+1去,还是不能匹配,所以f[i+1]直接=f[j+1]
        if(f[i+1]==j+1 && P[i+1]==P[j+1]) 
            f[i+1]=f[j+1];
    }
}
void find(char *T, char *P, int *f) //找到所有匹配点
{
    int n = strlen(T);
    int m = strlen(P);
    int j = 0;
    for(int i = 0; i < n; i++)
    {
        while(j && T[i] != P[j]) j = f[j];
        if(T[i] == P[j]) j++;
        if(j == m) printf("%d\n", i - m + 1);
    }
}
/*************************KMP模板****************************/
int main()
{
    return 0;
}

 

posted @ 2016-10-18 22:04  勿忘初心0924  阅读(195)  评论(0编辑  收藏  举报