这两种写法有何不同..?
查看原帖
这两种写法有何不同..?
444063
Jessica2333楼主2023/7/16 10:14
#include<iostream>
using namespace std;
string s1,s2;
int nxt[1000008],ans[1000008],tot=0;
void get_nxt()
{
	int i,j=1;
	nxt[1]=0;
	nxt[0]=-1;
	for(i=2;i<s2.length();i++)
	{
		while(j!=0&&s2[i]!=s2[j])
		{
			j=nxt[j-1]+1;
		}
		nxt[i]=j++;
	}
	return ;
}
void KMP()
{
	int i,j;
	i=1;
	j=1;
	for(;i<s1.length();)
	{
		while(i<s1.length()&&j<s2.length()&&s1[i]==s2[j])
		{
			i++;
			j++;
		}
		if(j==s2.length())
		{
			ans[++tot]=i-s2.length()+1;
			j=nxt[j-1]+1;
		}
		while(j!=0&&s1[i]!=s2[j])
		{
			j=nxt[j-1]+1;
		}
		if(j==0)
			i++,j++;
	}
	return ;
}
int main()
{
	int i,j,k;
	cin>>s1>>s2;
	s1=" "+s1;
	s2=" "+s2;
	get_nxt();
	KMP();
	for(i=1;i<=tot;i++)
		cout<<ans[i]<<endl;
	for(i=1;i<s2.length();i++)
		cout<<nxt[i]<<" ";
	return 0;
}

注释掉42行的if(j==0)就会算错,不注释掉就不会,不知道为什么会这样QAQ求大佬讲讲

2023/7/16 10:14
加载中...