/*
* poj_2752.cpp
*
* Created on: 2013年10月29日
* Author: Administrator
*/
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 400005;
int main() {
char str[maxn];
while (scanf("%s", str) != EOF) {
int len = strlen(str);
int suffix[maxn + 1];
int ans[maxn+1];
//应用KMP算法计算单词w的前缀函数
suffix[0] = -1;
suffix[1] = 0;
int cur, p = 0;
for (cur = 2; cur <= len; ++cur) {
while (p >= 0 && str[p] != str[cur - 1]) {
p = suffix[p];
}
suffix[cur] = ++p;
}
//求解前缀和后缀一样的位置..
int i,j = 0;
for(i = len ; suffix[i] != -1;){//只要suffix[i]!=-1都是前缀和后缀一样的
ans[j++] = i;
i = suffix[i];
}
for(i = j - 1 ; i > 0 ; --i){
printf("%d ",ans[i]);
}
printf("%d\n",ans[0]);
}
return 0;
}