全RE求助555
查看原帖
全RE求助555
788595
hezb2121楼主2022/9/27 09:21
#include <stdio.h>
#include <string.h>
#include <malloc.h>
using namespace std;
void Getnext(char* p,int* next);
int KMP(char* s,char* k){
	int m=strlen(s);
	int n=strlen(k);
	int i=0;
	int j=0;
	int next[10000]={0};//next数组 
	Getnext(k,next);//next数组赋值 
	while(i<m){
		if(s[i]==k[j]){
			i++;
			j++;
		}
		else{
			if(j>0){
				j=next[j-1]+1;
			}
			else{
				i++;//后移 
			}
		}
		if(j==n){
			printf("%d\n",i-j+1);
			j=next[n-1]+1;
		}
	}
}
void Getnext(char* p,int* next){
	int length=strlen(p);
	next[0]=-1;
	for(int i=1;i<length;i++){
		int temp=next[i-1];
		if(p[temp+1]==p[i]){
			next[i]=temp+1;
		}
		while((temp>=0)&&(p[temp+1]!=p[i])){
			temp=next[temp];
		}
		if(p[temp+1]==p[i]){
			next[i]=temp+1;
		}
		else{
			next[i]=-1;
		}
	}
}
int main(){
	char s[1000000]={0};
	char k[1000000]={0};
	scanf("%s",s);
	scanf("%s",k);
	int a=KMP(s,k);
	//int temp[100];
	int u=strlen(k);
	int temp[100000]={0};
	Getnext(k,temp);
	for(int i=0;i<u;i++){
		printf("%d ",temp[i]+1);
	}
	return 0;
	//printf("从第%d个开始匹配",a+1);
}
2022/9/27 09:21
加载中...