一点小问题
查看原帖
一点小问题
519936
Lqz114514楼主2023/3/7 21:36
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int next[N];
string s1,s2;
int idx;
void getNext(int ne[],string s)//获取模式串的前缀表 
{
	int j=0;//j指向前缀末尾位置,也可以表示在i位置及之前的最长相等前后缀的长度
	ne[0]=0;
	for(int i=1;i<s.length();i++)//i指向后缀末尾位置
	{
		while(s[i]!=s[j]&&j>0)//这里while不能被if替代,因为j在与i冲突时候
		                      //是连续回退,回退之后再次比较是否与i冲突 
		{
			j=ne[j-1];//回退 
		}
		if(s[i]==s[j]) j++;//j与i不冲突时,j向前推进,因为j与i不冲突
						   //所以i及i之前的最长相等前后缀的长度也变长了
						   //这也是为什么j可以表示这个长度的原因 
		ne[i]=j;//更新next数组的值 
	 } 
	return;
}
void KMP(string txt,string pat,int pos[])
{
	int i=0,j=0;
	getNext(next,pat);
	while(i<txt.length()&&j<pat.length())
	{
		if(j==0||txt[i]==pat[j])//j退回原位或匹配成功时,继续向下匹配 
		{
			i++;j++;
		}
		else j=next[j-1];
		if(j>=pat.length()) 
		{
			pos[idx]=i-pat.length()+1;
			idx++;
			j=0;
		}
	}
}
int main()
{
	int ans[N];
	cin>>s1>>s2;
	KMP(s1,s2,ans);
	for(int i=0;i<idx;i++) cout<<ans[idx]<<endl;
	for(int i=0;i<s2.length();i++) cout<<next[i]<<" ";
}

emmm,next数组我算的是对的,但是答案一直都是0,有无大佬告诉我为啥

2023/3/7 21:36
加载中...