自己写的KMP板子

来源:互联网 发布:vscode 新建工程 编辑:程序博客网 时间:2024/04/29 05:36

//获取匹配个数#include <bits/stdc++.h>  using namespace std;  const int maxn = 5005;  int nt[maxn];  char a[maxn], b[maxn];  void GetNext(char b[], int blen)  {      int j = 0, k = -1;      nt[0] = -1; --blen;      while(j < blen)      {          if(k == -1 || b[j] == b[k])          {              ++j; ++k;              nt[j] = k;        }          else k = nt[k];      }  }  int KMP(char a[], char b[], int alen, int blen)  {  if(alen < blen) return 0;    int ans = 0;      if(blen == 1)      {          for(int i = 0; i < alen; ++i)          {              if(a[i] == b[0]) ++ans;          }          return ans;      }      int i = 0, j = 0;      GetNext(b, blen);      while(i < alen)      {          if(j == -1 || a[i] == b[j])          {              ++i; ++j;          }          else j = nt[j];          if(j == blen)          {              ++ans;              --i;              j = nt[j-1];          }      }      return ans;  }  int main()  {      int alen, blen;      cin >> a >> b;      alen = strlen(a);      blen = strlen(b);      cout << KMP(a, b, alen, blen) << endl;      return 0;  }

//判断是否存在匹配#include <bits/stdc++.h>  using namespace std;  const int maxn = 5005;  int nt[maxn];  char a[maxn], b[maxn];  void GetNext(char b[], int blen)  {      int j = 0, k = -1;      nt[0] = -1; --blen;      while(j < blen)      {          if(k == -1 || b[j] == b[k])          {              ++j; ++k;              if(b[j] == b[k]) nt[j] = nt[k];             else nt[j] = k;        }          else k = nt[k];      }  }  int KMP(char a[], char b[], int alen, int blen)  {if(alen < blen) return 0;    if(blen == 1)      {          for(int i = 0; i < alen; ++i)          {              if(a[i] == b[0]) return 1;          }          return 0;      }      int i = 0, j = 0;      GetNext(b, blen);      while(i < alen && j < blen)     {          if(j == -1 || a[i] == b[j])          {              ++i; ++j;          }          else j = nt[j];    }      if(j == blen) return 1;    return 0;}  int main()  {      int alen, blen;      cin >> a >> b;      alen = strlen(a);      blen = strlen(b);      if(KMP(a, b, alen, blen)) cout << "YES" << endl;    else cout << "NO" << endl;      return 0;  }

//寻找首次出现位置#include <bits/stdc++.h>  using namespace std;  const int maxn = 5005;  int nt[maxn];  char a[maxn], b[maxn];  void GetNext(char b[], int blen)  {      int j = 0, k = -1;      nt[0] = -1; --blen;      while(j < blen)      {          if(k == -1 || b[j] == b[k])          {              ++j; ++k;              if(b[j] == b[k]) nt[j] = nt[k];             else nt[j] = k;        }          else k = nt[k];      }  }  int KMP(char a[], char b[], int alen, int blen)  {if(alen < blen) return -1;    if(blen == 1)      {          for(int i = 0; i < alen; ++i)          {              if(a[i] == b[0]) return i;          }          return -1;      }      int i = 0, j = 0;      GetNext(b, blen);      while(i < alen && j < blen)     {          if(j == -1 || a[i] == b[j])          {              ++i; ++j;          }          else j = nt[j];    }      if(j == blen) return i-blen;    return -1;}  int main()  {      int alen, blen;      cin >> a >> b;      alen = strlen(a);      blen = strlen(b);      cout << KMP(a, b, alen, blen) << endl;    return 0;  }

//寻找所有匹配成功的在主串中的起点#include <bits/stdc++.h>  using namespace std;  const int maxn = 5005;  int nt[maxn];  char a[maxn], b[maxn];  vector<int> vt;void GetNext(char b[], int blen)  {      int j = 0, k = -1;      nt[0] = -1; --blen;      while(j < blen)      {          if(k == -1 || b[j] == b[k])          {              ++j; ++k;              nt[j] = k;        }          else k = nt[k];      }  }  void KMP(char a[], char b[], int alen, int blen)  {      if(alen < blen) return;     if(blen == 1)      {          for(int i = 0; i < alen; ++i)          {              if(a[i] == b[0]) vt.push_back(i);          }          return;      }      int i = 0, j = 0;      GetNext(b, blen);      while(i < alen)      {          if(j == -1 || a[i] == b[j])          {              ++i; ++j;          }          else j = nt[j];          if(j == blen)          {              vt.push_back(i-blen);             --i;              j = nt[j-1];          }      }}  int main()  {      int alen, blen;      cin >> a >> b;      alen = strlen(a);      blen = strlen(b);      KMP(a, b, alen, blen);    for(int i = 0; i < vt.size(); ++i) cout << vt[i] << " ";    cout << endl;     return 0;  }


继续加油~