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;
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的主要内容,如果未能解决你的问题,请参考以下文章