求助站外题

灌水区

forever516 @ 2024-11-29 20:20:15

题目

代码求调:

#include<bits/stdc++.h>
using namespace std;
const int N=1e4+10;
char s[N],p[N];
int ne[N],cnt=0;
void gn(char *p,int plen) {
    ne[0]=0;
    ne[1]=0;
    for(int i=1; i<plen; i++) {
        int j=ne[i];
        while(p[i]!=p[j])j=ne[j];
        if(p[i]==p[j])ne[i+1]=ne[i]+1;
        else ne[i+1]=0;
    }
}
void kmp(char *s,char *p) {
    cnt=0;
    int l=-1,j=0,slen=strlen(s),plen=strlen(p);
    gn(p,plen);
    for(int i=0; i<slen; i++) {
        while(j&&s[i]!=p[j])j=ne[j];
        if(s[i]==p[j])j++;
        if(j==plen) {
            if(i-l>=plen) {
                cnt++;
                l=i;
            }
        }
    }
}
int main() {
    while(cin>>s) {
        if(s[0]=='#')break;
        cin>>p;
        kmp(s,p);
        cout<<cnt<<"\n";
    }
    return 0;
}

|