#include<bits/stdc++.h>
using namespace std;
const int N=1000;
string s1,s2;
int n,m,cnt;
int nextt[N];
int a[N];
void pre(string s)
{
int k=-1,i=0;
nextt[0]=-1;
while(i<n)
{
//cout<<"循环pre"<<endl;
if(k==-1||s[i]==s[k])
//本来k=1的时候就是1,所以有这个条件
//另外一种是匹配上了,i一般是在k的后面,所以++之后,赋值
{
i++,k++;
nextt[i]=k;
}
else
//里面存在一个小的kmp思想
//当匹配没有成功,意味着前面可能有成功的,所以回退,从新的位置比较,
//如果一直不成功,k回到-1之后,加加变成0之后,赋值为0
{
k=nextt[k];
}
}
}
void kmp()
{
int j=0;
for(int i=0; i<m; i++)
{
while(s1[i]!=s2[j]&&j>=0)
{
j=nextt[j];//一直回跳
//一直跳到初始状态
}
if(s1[i]==s2[j])
{
j++;//不用加i
}
if(j==n)
{
j=nextt[j-1];
a[cnt++]=i;
}
}
}
int main()
{
cin>>s1>>s2;
n=s2.length();
m=s1.length();
pre(s2);
kmp();
for(int i=cnt;i>=0;i--)
{
cout<<a[i]+1<<endl;
}
for(int i=1;i<=n;i++)
{
if(i!=1)
{
cout<<" ";
}
cout<<nextt[i];
}
}
KMP 算法
于 2023-06-27 09:47:16 首次发布