luogu_3375 【模板】KMP字符串匹配

#include<bits/stdc++.h>

using namespace std;

int f[1000010],n,m;

char p[1000010],t[1000010];

void getfail(){

f[0]=f[1]=0;

for(int i=1;i<m;i++){

int j=f[i];

while(j && p[i]!=p[j])j=f[j];

f[i+1]=p[i]==p[j]?j+1:0;

}

}

void find(){

getfail();

int j=0;

for(int i=0;i<n;i++){

while(j && t[i]!=p[j])j=f[j];

if(t[i]==p[j])j++;

if(j==m)printf("%d\n",i-m+2);

}

}

int main(){

scanf("%s%s",&t,&p);

n=strlen(t); m=strlen(p);

find();

for(int i=1;i<=m;i++)printf("%d ",f[i]);

puts("");

return0;

}

posted @ 2017-07-01 07:26  wqtnb_tql_qwq_%%%  阅读(180)  评论(0编辑  收藏  举报