KMP

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了KMP相关的知识,希望对你有一定的参考价值。

http://www.matrix67.com/blog/archives/115

http://www.cnblogs.com/c-cloud/p/3224788.html 

 1 #include<stdio.h>
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<string.h>
 5 #include<stdlib.h>
 6 #include<math.h>
 7 #include<cstdio>
 8 #include<queue>
 9 #include<stack>
10 void Next(int x);
11 int KMP(int k,int y);
12 const int N=1e6+10;
13 int NEXT[N];
14 int A[N];
15 int B[N];
16 using namespace std;
17 int main(void)
18 {
19     int n,i,j,k,p,q;
20     scanf("%d",&k);
21     while(k--)
22     {
23         scanf("%d %d",&p,&q);
24         for(i=1;i<=p;i++)
25         scanf("%d",&A[i]);
26         for(i=1;i<=q;i++)
27         scanf("%d",&B[i]);
28         Next(q);
29         int xx=KMP(p,q);
30         if(xx==p+1)
31         {
32             printf("-1\\n");
33         }
34         else printf("%d\\n",xx-q+1);
35     }
36     return 0;
37 }
38 
39 void Next(int x)
40 {
41     int i,j;
42     NEXT[0]=0;
43     NEXT[1]=0;
44     j=0;
45     for(i=2;i<=x;i++)
46     {
47         while(j>0&&B[j+1]!=B[i])
48         {
49             j=NEXT[j];
50         }
51         if(B[j+1]==B[i])
52         {
53             j++;
54         }
55         NEXT[i]=j;
56 
57     }
58 }
59 int KMP(int k,int y)
60 {
61     int i,j;
62     j=0;
63     for(i=1;i<=k;i++)
64     {
65         while(j>0&&A[i]!=B[j+1])
66         {
67             j=NEXT[j];
68         }
69         if(A[i]==B[j+1])
70         {
71             j++;
72         }
73         if(j==y)
74         {
75             break;
76         }
77     }
78     return i;

79 } 

以上是关于KMP的主要内容,如果未能解决你的问题,请参考以下文章

kmp算法的个人理解

Python ---- KMP(博文推荐+代码)

KMP算法及Python代码

KMP算法及Python代码

Kmp算法Java代码实现

数据结构—串KMP模式匹配算法