title

kmp

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
const int N =1000010;
int lens,lenss,nxt[N];
char s[N],ss[N];//s文本串(长串) ss模式串(短串) 
inline void getnxt(){
	int k=0;
	for(int i=1;i<lenss;++i){
		while(k && ss[k]!=ss[i])	k=nxt[k];
		if(ss[k]==ss[i])	++k;
		nxt[i+1]=k;
	}
}
inline void kmp(){
	getnxt();
	int k=0;
	for(int i=0;i<=lens;++i){
		while(k && ss[k]!=s[i])	k=nxt[k];
		if(ss[k]==s[i])	++k;
		if(k==lenss){
			printf("%d\n",i-lenss+2);
			k=nxt[k];
		}
	}
}
int main(){
	scanf("%s %s",s,ss);
	lens=strlen(s);lenss=strlen(ss);
	kmp();
	for(int i=1;i<=lenss;++i)	printf("%d ",nxt[i]);
	return 0;
}
posted @ 2018-09-10 01:37  Horrigue_JyowYang  阅读(80)  评论(0编辑  收藏  举报