根据nxt数组的定义,就是前缀等于后缀最大的子串长度。
for一遍也行,while(nxt[tp])也行。
KMP这种东西尽量每次都手敲吧,最基础的算法没必要套板子
#include<cstring>
#include<iostream>
#include<vector>
using namespace std;
typedef long long ll;
const int M = 1e6+7;
struct KMP
{
char p[M],t[M];//模式串p,文本串t,p在t中出现次数,及位置, 下标1-n
int nxt[M],n,m,f[M];//nxt[i]:模式串p下标i位置前缀和后缀最大匹配的长度。(不包括自身)
//f[i]: 文本串t下标i位置后缀子串与模式串p后缀子串最大匹配的长度。
void get_nxt()
{
n=strlen(p+1);
nxt[1]=0;
for(int i=2,j=0;i<=n;i++)
{
while(j&&p[i]!=p[j+1])j=nxt[j];
if(p[i]==p[j+1])j++;
nxt[i]=j;
}
}
void gao()
{
}
int get_minc()//求p的最小循环节
{
}
}kmp;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
while(cin>>(kmp.p+1))
{
kmp.get_nxt();
int tp=kmp.n;
vector<int>v;
while(tp)
{
v.push_back(tp);
tp=kmp.nxt[tp];
}
for(int i=v.size()-1;i>=0;i--)cout<<v[i]<<" ";
cout<<endl;
}
return 0;
}