深入理解KMP中的next,当我们求完next之后,len为字符串S的长度, 令j = next[len],k = next[j],则有:S[j-k+1, j] = S[len-k+1, len],就是根据这个思路来求解这个问题;
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int MAXN = 400010;
int next[MAXN];
void Get_next(char* str)
{
int i = 0, j = -1;
next[0] = -1;
int len = strlen(str);
while(i < len)
{
if(j == -1 || str[i] == str[j])
{
++i;
++j;
next[i] = j;
}
else
j = next[j];
}
}
int main()
{
char str[MAXN];
while( ~scanf("%s", str) )
{
Get_next(str);
int len = strlen(str);
int k = 0, i = len;
int sum[MAXN];
sum[0] = len;
while(next[i] > 0)
{
sum[++k] = next[i];
i = next[i];
}
for(i = k; i >= 0; i--)
cout<<sum[i]<<" ";
cout<<endl;
}
return 0;
}