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;}

 

你可能感兴趣的:(KMP)