poj 3461 KMP模式匹配算法

哎~看了N天的KMP字符串匹配算法,还是不怎么懂,照着书上写的模板写了一遍,以后继续研究。。。。

View Code
 1 /*
2 * Author:lonelycatcher
3 * problem:poj 3461
4 * Type:字符串匹配算法 Rabin-Karp算法 ,KMP算法(Rabin_-Karp算法会超时)
5 */
6 #include <iostream>
7 #include<string.h>
8 #include<string>
9 #include<stdio.h>
10 using namespace std;
11 char p[100000];
12 char T[10000000];
13 int next[100000],ans;
14 void getNext()//获取next函数
15 {
16 int j=0,k=-1,len=strlen(p);
17 next[0]=-1;
18 while(j<len)
19 {
20 if(k==-1 || p[j]==p[k])
21 {
22 j++;k++;
23 next[j]=k;
24 }
25 else
26 {
27 k=next[k];
28 }
29 }
30 }
31 void KMP()
32 {
33 memset(next,0,sizeof(next));
34 getNext();
35 int posP=0,posT=0;
36 int lenP=strlen(p);
37 int lenT=strlen(T);
38 while(posT<lenT)
39 {
40 if(posP==-1 || p[posP]==T[posT])
41 {
42 posP++;posT++;
43 }
44 else posP=next[posP];
45 if(posP==lenP)
46 {
47 ans++;
48 posP=next[posP];
49 }
50 }
51
52 }
53 int main()
54 {
55 int N;
56 cin>>N;
57 while(N--)
58 {
59 scanf("%s",p);
60 scanf("%s",T);
61 ans=0;
62 KMP();
63 printf("%d\n",ans);
64 }
65 return 0;
66 }

你可能感兴趣的:(poj)