KMP模板

打算学AC自动机,才发现博客里没有写KMP的板子,补一发。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define foru(i,x,y) for(int i=x;i<=y;i++)
 5 using namespace std;
 6 
 7 int nxt[1000010],lb,la;
 8 char sa[1000010],sb[1030];
 9 //nxt[i]:模式串的前i位中,最长公共前后缀的长度
10 //注意,前缀不含s[len],后缀不含s[0] 
11 void getnxt(){
12     for(int k=0,i=1;i<lb;i++){
13         while(k>0&&sb[i]!=sb[k])
14             k=nxt[k-1];//最长公共前后缀失配,向前寻找 
15         if(sb[i]==sb[k])k++;
16         nxt[i]=k;
17     }
18 }
19 
20 void kmp(){
21     for(int i=0,j=0;i<la&&j<lb;i++){
22         while(j>0&&sa[i]!=sb[j])j=nxt[j-1];//失配时直接移动到前一位的nxt[]位置 
23         if(sa[i]==sb[j])j++;
24         if(j==lb){printf("%d %d\n",i-lb+2,i+1);return;}
25     }
26     printf("NO\n");
27 }
28 
29 int main(){
30     scanf("%s%s",sa,sb);//sa为母串 sb为模式串 
31     la=strlen(sa);lb=strlen(sb);
32     getnxt();
33     kmp();
34     return 0;
35 }

 

posted @ 2017-07-28 23:25  羊毛羊  阅读(202)  评论(0编辑  收藏  举报