求优化,谢谢
查看原帖
求优化,谢谢
355521
rainbow_star楼主2021/11/8 07:39
//数组下标从0开始 
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=1000001;
char s1[N],s2[N];
int kmp[N];
int main()
{
	scanf("%s",s1);
	scanf("%s",s2);
	int i,len;
	len=0;
	for(i=1;i<strlen(s2);i++)
	{
//		if(s2[i]==s2[len])
//		{
//			len++;
//			kmp[i]=len;
//		}
//		else
//		{
//			len=0;
//			kmp[i]=0;
//		}
		while(len!=0&&s2[i]!=s2[len])
			len=kmp[len-1];
		if(s2[i]==s2[len])
			len++;
		kmp[i]=len;
	}
	len=0;
	for(i=0;i<strlen(s1);i++)
	{
		while(len!=0&&(len==strlen(s2)||s1[i]!=s2[len]))
			len=kmp[len-1];
		if(s1[i]==s2[len])
			len++;
		if(len==strlen(s2))
			printf("%d\n",i-strlen(s2)+2);
	}
	for(i=0;i<strlen(s2);i++)
		printf("%d ",kmp[i]);
	return 0;
}
2021/11/8 07:39
加载中...