MnZnKMP求调
查看原帖
MnZnKMP求调
752094
MornHus楼主2023/3/4 22:00
#include<bits/stdc++.h>
using namespace std;
int la,lb;
char a[1000001];
char b[1000001];
int kmp[1000001];
int main(){
	scanf("%s%s",a+1,b+1);
	la=strlen(a+1);
	lb=strlen(b+1);
	for(int i=2;i<=lb;i++){
		int j=kmp[i-1];
		while(j>0&&b[i]!=b[j+1])j=kmp[j-1];
		if(b[i]==b[j+1])j++;
		kmp[i]=j;
	}
	int j=0;
	for(int i=1;i<=la;i++){
		while(j&&b[j+1]!=a[i])j=kmp[j];
		if(b[j+1]==a[i]){
			j++;
		}
		if(j==lb){
			printf("%d\n",i-lb+1);
			j=kmp[j];
		}
	}
	for(int i=1;i<=lb;i++){
		printf("%d ",kmp[i]);
	}
	return 0;
}
2023/3/4 22:00
加载中...