KMP

Posted wuruofeng

tags:

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

http://hihocoder.com/problemset/problem/1015

 

AC:

 1 #include<iostream>  
 2 #include<cstring> 
 3 #include<string>
 4 using namespace std;  
 5 int Next[10001];
 6 //求KMP的Next数组  
 7 void GetNext(const string& p)  
 8 {  
 9     int len=p.size();  
10     int i=0;  
11     int j=-1;  
12     Next[i]=j;  
13     while(i<len)  
14     {  
15         if(j==-1||p.at(i)==p.at(j))  
16         {  
17             i++;  
18             j++;  
19             if(i==len||p.at(i)!=p.at(j))//不允许出现P[i]==P[next[i]]  
20                 Next[i]=j;  
21             else  
22                 Next[i]=Next[j];  
23         }  
24         else  
25         {  
26             j=Next[j];  
27         }  
28     }  
29       
30 } 
31  
32  
33 //S为母串,p为匹配子串,如果匹配返回匹配位置,否则返回-1  
34 int KMPSearch(const string& s,const string& p)  
35 {  
36     unsigned int Slen=s.size();  
37     unsigned int Plen=p.size();
38     //int *Next=new int[Plen];//Next数组存储位置  
39   
40     GetNext(p);//求得Next数组  
41   
42     unsigned int i=0;//在S串中的下标  
43     unsigned int j=0;//在P串中的下标  
44     unsigned int count=0;//匹配串出现的次数
45     while(i<Slen)  
46     {  
47         if(j==-1||s.at(i)==p.at(j))  
48         {  
49             i++;  
50             j++;  
51         }  
52         else  if(j<Plen)
53             j=Next[j];  
54         if(j==Plen)
55         {
56             count++;
57             j=Next[Plen];
58         }
59     }   
60     return count;
61 }
62  
63 int main()  
64 {  
65     //freopen("in.txt", "r", stdin);
66     string str1;  
67     string str2;  
68     int n;
69     cin>>n;
70     for(int i=0;i<n;i++)
71     {
72         cin>>str2;
73         cin>>str1; 
74          
75         int pos=KMPSearch(str1,str2);  
76         cout<<pos<<endl; 
77     
78     }
79    
80     return 0;  
81 }  

WA:自己写的,本地样例全过,不知道错那

 1 #include <iostream>
 2 #include <cstring>
 3 using namespace std;
 4 char T[1000000+5];
 5 char V[1000000+5];
 6  void getnext(char *T,int next[])     
 7  {
 8      int j=0;
 9      next[0]=0;
10      for(int i=1;i<strlen(T);i++)
11      {
12          while(j>0 && T[i]!=T[j]){
13              j=next[j-1];
14      }
15     if(T[i]==T[j]) j++;
16     next[i]=j;    
17  }
18  for(int i=strlen(T)-1;i>0;i--){     
19      next[i]=next[i-1];
20  }
21  next[0]=-1;
22  
23  }
24 
25 int kmp(char *T,char *V){             
26      int next[1000000+5];
27     int flag=0;
28      getnext(V,next);
29      int i=0,j=0;
30      while(i<strlen(T) && j< strlen(V)){
31          if(T[i]==V[j] ){
32              i++;
33              j++;
34          }
35          else{
36              
37              j=next[j];
38              if(j==-1){
39                  i++;j++;
40              }
41          }
42          
43          if(j==strlen(V)-1 && V[j]==T[i]){
44              flag++; 
45              j=next[j];
46          }
47      }
48      return flag;
49  }
50 
51 int main(int argc, char *argv[]) {
52     int n;
53     cin>>n;
54     while(n--){
55         scanf("%s%s",V,T);
56         if(n==0)
57         cout<<kmp(T,V)<<endl;
58         else
59         cout<<kmp(T,V);
60     }
61 }

 

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

kmp算法的个人理解

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

KMP算法及Python代码

KMP算法及Python代码

Kmp算法Java代码实现

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