首页 > 代码库 > KMP算法模板 求子串和模板串首先匹配的位置

KMP算法模板 求子串和模板串首先匹配的位置

 1  #include <cstdio> 2  using namespace std; 3  4  const int MAXN = 1e6 + 10; 5  int nex[MAXN]; 6  int s[MAXN], t[MAXN]; 7  8  void get_nex(int lm)    { 9      int i = 0, j = -1;   nex[0] = -1;10      while (i < lm)  {11          if (j == -1 || t[j] == t[i]) {12              i++;    j++;    nex[i] = j;13          }14          else    j = nex[j];15      }16  }17 18  int KMP(int ln, int lm)   {19      get_nex (lm);20      int i = 0, j = 0;21      while (i < ln)  {22          while (j != -1 && s[i] != t[j]) j = nex[j];23          i++;    j++;24          if (j == lm) return (i - j + 1);25      }26      return -1;27  }28 29  int main()    {30      int T;31     scanf ("%d", &T);32      while (T--)   {33          int ln, lm; scanf ("%d%d", &ln, &lm);34          for (int i=0; i<ln; ++i)   scanf ("%d", &s[i]);35          for (int i=0; i<lm; ++i)   scanf ("%d", &t[i]);36          printf ("%d\n", KMP (ln, lm));37      }38 39      return 0;40  }

 

KMP算法模板 求子串和模板串首先匹配的位置