#include<bits/stdc++.h>
using namespace std;
int nex[1001];//nex[i]=j: 下标为i的字符前最长相等的前后缀是j
//j也代表了最长前后缀的值
void getnex(int nexx[],string s)
{
//j是前缀末尾 i是后缀末尾
//a a b a a f
//0 1 0 1 2 0
//first step : initial
int j=0;nexx[0]=0;
for(int i=1;i<s.size();i++)
{
//前后缀不相同
while(j>0&&s[i]!=s[j])
j=nexx[j-1] ;//j 调回去
if(s[i]==s[j])
j++;
nexx[i]=j;
}
}
int main()
{
string s;
cin>>s;
int nex[1001];
getnex(nex,s);
for (int i=0;i<s.size();i++)
cout<<nex[i];
}
kmp9.18
最新推荐文章于 2024-05-05 11:35:29 发布