Where_Free

羸弱 无知 自大 懒惰

KMP模板

 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4 int Next1[1000000];
 5 char a[1000005],b[1000005];
 6 /* P 为模式串,下标从 0 开始 */
 7 void GetNext(string P,int next1[]){
 8     int p_len=P.size();
 9     int i=0;   // P 的下标
10     int j=-1;
11     next1[0]=-1;
12 
13     while(i<p_len-1){
14         if (j == -1 || P[i] == P[j]){
15             i++;
16             j++;
17             if(P[i]!=P[j])next1[i]=j;
18             else next1[i]=next1[j];
19         }
20         else
21             j=next1[j];
22     }
23 }
24 
25 /* 在 S 中找到 P 第一次出现的位置 */
26 int KMP(string S,string P,int Next[]){
27     GetNext(P, Next);
28     int i=0;  // S 的下标
29     int j=0;  // P 的下标
30     int s_len=S.size();
31     int p_len=P.size();
32     while (i<s_len&&j<p_len){
33         if (j==-1||S[i]==P[j]){  // P 的第一个字符不匹配或 S[i] == P[j]
34             i++;
35             j++;
36         }
37         else
38             j=Next[j];  // 当前字符匹配失败,进行跳转
39     }
40 
41     if (j==p_len)  // 匹配成功
42         return i-j;
43 
44     return -1;
45 }
46 
47 int main(){
48     int n,ind;
49 
50     cin>>a;
51     cin>>b;
52  ind=KMP(a,b,Next1);
53     if(ind!=-1){
54         cout<<ind<<'\n';
55     }
56     else cout<<-1<<'\n';
57     return 0;
58 }

之前的有bug,还好多人抄了这篇博客。。。特此致歉

posted on 2019-05-06 20:23  Where_Free  阅读(264)  评论(0编辑  收藏  举报

导航