KMP未完

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
void init(){
scanf("%s\n%s",&ch1.ch,&ch2.ch);
l1=strlen(ch1.ch); l2=strlen(ch2.ch);
for (int i=l1;i>=1;i--) ch1.ch[i]=ch1.ch[i-1];
for (int i=l2;i>=1;i--) ch2.ch[i]=ch2.ch[i-1];
}


void COMPUTE_PREFIX_FUNCTION(){
memset(pi1,0,sizeof(pi1));
int k=0;
pi1[1]=0;
for (int i=2;i<=l2;i++){
while (k>0&&ch2.ch[k+1]!=ch2.ch[i]) k=pi1[k];
if (ch2.ch[k+1]==ch2.ch[i]) k++;
pi1[i]=k;
}
}


void KMP_MATCHER(){
int q=0;
    for (int i=1;i<=l1;i++){
while (q>0&&ch2.ch[q+1]!=ch2.ch[i]) q=pi1[q];
if (ch2.ch[q+1]==ch2.ch[i]) ++q;
if (q==l2) cout<<i<<endl;
q=pi1[q];
    }
}


int main(){
init();
COMPUTE_PREFIX_FUNCTION();
KMP_MATCHER();
return 0;
}

你可能感兴趣的:(KMP未完)