kmp

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1005;
int Next[MAXN];
char str[MAXN],pattern[MAXN];
int cnt;
int getFail(char *p,int plen){
    Next[0]=0,Next[1]=0;
    for(int i=1;i<plen;i++){
        int j=Next[i];
        while(j&&p[i]!=p[j]) j=Next[j];
        Next[i+1]=(p[i]==p[j])?j+1:0;
    }
}
int kmp(char *s,char *p){
    int last=-1;
    int slen=strlen(s),plen=strlen(p);
    getFail(p,plen);
    int j=0;
    for(int i=0;i<slen;i++){
        while(j&&s[i]!=p[j])j=Next[j];
        if(s[i]==p[j])j++;
        if(j==plen){
            //printf("at location= %d, %s\n",i+1-plen,&s[i+1-plen]);
            if(i-last>=plen){
                cnt++;
                last=i;
            }
        }
    } 
}
int main(){
    while(~scanf("%s",str)){
        if(str[0]=='#') break;
        scanf("%s",pattern);
        cnt=0;
        kmp(str,pattern);
        cout<<cnt;
    }
}

 

posted @ 2020-06-20 21:27  _LH2000  阅读(154)  评论(0编辑  收藏  举报