kmp算法学习
作者:
SuperXin
,
2021-05-17 21:16:33
,
所有人可见
,
阅读 367
#include<iostream>
using namespace std;
char s[20],t[20];//s为主串,t为模式串
int nt[20],nextval[20],m,n;
//求next数组
void get_next()
{
int i=1,j=0;
nt[1]=0;
while(i<n)
{
if(j==0||t[i]==t[j])nt[++i]=++j;
else j=nt[j];
}
}
//进一步优化kmp
void get_nextval()
{
nextval[1]=0;
for(int i=2;i<=n;i++)
{
if(t[nt[i]]==t[i])nextval[i]=nextval[nt[i]];
else nextval[i]=nt[i];
}
}
int index_kmp()
{
int i=1,j=1;
while(i<=m&&j<=n)
{
if(j==0||s[i]==t[j])i++,j++;
else j=nt[j];
}
if(j>n)return i-n;
else return 0;
}
int main()
{
scanf("%d%d",&m,&n);
for(int i=1;i<=m;i++)cin>>s[i];
for(int i=1;i<=n;i++)cin>>t[i];
get_next();
cout<<"模式串t在主串s中的位置为:"<<index_kmp()<<endl;
for(int i=1;i<=n;i++)cout<<nt[i]<<" ";
cout<<endl;
get_nextval();
for(int i=1;i<=n;i++)cout<<nextval[i]<<" ";
return 0;
}
你的进一步优化kmp是基于什么实现的