码迷,mamicode.com
首页 > 其他好文 > 详细

KMP

时间:2016-02-08 21:25:18      阅读:591      评论:0      收藏:0      [点我收藏+]

标签:

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

标签:

原文地址:http://www.cnblogs.com/zzuli2sjy/p/5185214.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!