KMP算法

长文章:https://www.cnblogs.com/ZuoAndFutureGirl/p/9028287.html

板题:求子串在主串中出现的次数

#include<bits/stdc++.h>
using namespace std;
const int M=1e6+6;
char S[M],T[M];
int nextt[M];
int ans=0;
void makeNext(){

    int m=strlen(T);
    nextt[0]=0;
    for (int i=1,j=0;i<m;i++){
        while(j>0&&T[i]!=T[j])
            j=nextt[j-1];
        if(T[i]==T[j])
           j++;
        nextt[i]=j;
    }
}
void kmp(){
    int n,m;
    n = strlen(S);
    m = strlen(T);
    makeNext();
    for (int i=0,q=0;i<n;i++){
        while(q>0&&T[q]!=S[i])
            q=nextt[q-1];
        if(T[q]==S[i])
            q++;
        if(q==m)
           ans++;
    }
}
 
 int main()
 {
     while(~scanf("%s%s",S,T))
     {
         ans=0;
        kmp();
        printf("%d\n",ans);
    }
    return 0;
}
View Code

 

posted @ 2019-09-12 23:01  starve_to_death  阅读(161)  评论(0编辑  收藏  举报