Understand the meaning of the P array in the KMP algorithm (commonly used next array, but I used to name it p ^_^). The meaning of the P array is the same as that of the maximum K characters in the prefix, therefore, finding J = P [J] from the last one is the result. Note that the output is from small to large.
#include <map>#include <set>#include <list>#include <queue>#include <deque>#include <stack>#include <string>#include <time.h>#include <cstdio>#include <math.h>#include <iomanip>#include <cstdlib>#include <limits.h>#include <string.h>#include <iostream>#include <fstream>#include <algorithm>using namespace std;#define LL long long#define MIN INT_MIN#define MAX INT_MAX#define PI acos(-1.0)#define FRE freopen("input.txt","r",stdin)#define FF freopen("output.txt","w",stdout)#define N 400005char str[N];int p[N];int ans[N];int main () { while (scanf("%s",str+1) != -1) { int len = strlen(str+1); int i,j = 0; p[1] = 0; cout<<1<<"-->"<<0<<endl; for (i = 2; i <= len; i++) { while (j > 0 && str[i] != str[j+1]) j = p[j]; if (str[i] == str[j+1]) j++; p[i] = j;cout<<i<<"-->"<<j<<endl; } int cnt = 0; for (i = len; i != 0; i = p[i]) { ans[cnt++] = i; } printf("%d",ans[cnt - 1]); for (i = cnt - 2; i >= 0; i--) printf(" %d",ans[i]); puts(""); } return 0;}