KMP模板

来源:互联网 发布:单片机仿真软件怎么用 编辑:程序博客网 时间:2024/04/29 18:21

风格一:出处大白(●—●)

#include<cstdio>#include<iostream>#include<algorithm>#include<cmath>#include<cstring>using namespace std;const int maxn = 110;char s[maxn];char p[maxn];int f[maxn];    void getFail(char* P, int* f)      {          int m = strlen(P);          f[0] = 0;          f[1] = 0;          for(int i = 1; i < m; i++)          {              int j = f[i];              while(j && P[i] != P[j])              {                  j = f[j];              }              f[i + 1]=P[i]==P[j]?j+1:0;          }      }      int find(char* T, char*P, int*f)      {          int n = strlen(T), m = strlen(P);          getFail(P, f);          int j = 0;          for(int i = 0; i < n; i++)          {              while(j && P[j] != T[i])              {                  j = f[j];              }              if(P[j] == T[i])              {                  j++;              }              if(j == m)              {                  return i - m + 1;              }          }          return -1;      }  int main(){    scanf("%s%s",s,p);    cout<<find(s,p,f)+1;    return 0;}

风格二[主流风格]

 void get_next(){    int k=-1,j=0;    next[0]=-1;    while(j<pl)    {        if(k==-1||p[j]==p[k])        {            j++;k++;            next[j]=k;        }        else        k=next[k];    }}int KMP(){    int i=0,j=0;    get_next();    while(j<pl&&i<sl)    {            if(j==-1||s[i]==p[j])            {                i++;j++;            }            else j=next[j];            if(j==pl)            {                sum++;j=next[j];            }    }    return sum;}

略微改进

void get_next(){    int k=-1,j=0;    next[0]=-1;    while(j<pl)    {        if(k==-1||p[j]==p[k])        {            j++;k++;       //     next[j]=k;            if(next[j]!=next[k])next[j]=k;            else next[j]=next[k];        }        else        k=next[k];    }}int KMP(){    int i=0,j=0;    get_next();    while(j<pl&&i<sl)    {            if(j==-1||s[i]==p[j])            {                i++;j++;            }            else j=next[j];            if(j==pl)            {                sum++;j=next[j];            }    }    return sum;}
1 0
原创粉丝点击