#include <bits/stdc++.h>
using namespace std;
using ll = long long int;
#define mod 1000000009LL
#define base 257
struct hashed_string{
private:
string s; ll n;
vector <ll> prefix;
vector <ll> pow;
public:
hashed_string(string a){
s = a; n = a.size();
prefix.assign(n, 0);
ll sum = 0;
pow.assign(n+1, 0);
pow[0] = 1;
for (int i = 1; i <= n; i++){
pow[i] = (pow[i-1] * base) % mod;
}
for (int i = 0; i < n; i++){
prefix[i] = ((sum * base) % mod + s[i] - 'a') % mod;
sum = prefix[i];
}
}
ll get_hash(ll l, ll r){
ll x = prefix[r];
if (l >= 1){
l--;
x = ((x - prefix[l] * pow[r - l] % mod) % mod + mod) % mod;
}
return x;
}
};
void solve(){
string s;
cin >> s;
ll n = s.size();
vector <ll> answ;
hashed_string v(s);
for (int i = 0; i < n; i++){
ll cur = v.get_hash(0, i);
ll sz = i + 1;
bool flag = true;
for (int j = 0; j + sz - 1 < n; j+=sz){
if (!(cur == v.get_hash(j, j + sz - 1))){
flag = false;
break;
}
}
if (n % sz >= 1){
ll left_over = n % sz;
flag = flag && (v.get_hash(n - left_over, n-1) == v.get_hash(0, left_over - 1));
}
if (flag) answ.push_back(sz);
}
for (auto &p : answ){
cout << p << " ";
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
solve();
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnVzaW5nIGxsID0gbG9uZyBsb25nIGludDsKI2RlZmluZSBtb2QgMTAwMDAwMDAwOUxMCiNkZWZpbmUgYmFzZSAyNTcKc3RydWN0IGhhc2hlZF9zdHJpbmd7CiAgICBwcml2YXRlOgogICAgc3RyaW5nIHM7IGxsIG47CiAgICB2ZWN0b3IgPGxsPiBwcmVmaXg7CiAgICB2ZWN0b3IgPGxsPiBwb3c7CiAgICBwdWJsaWM6CiAgICBoYXNoZWRfc3RyaW5nKHN0cmluZyBhKXsKICAgICAgICBzID0gYTsgbiA9IGEuc2l6ZSgpOwogICAgICAgIHByZWZpeC5hc3NpZ24obiwgMCk7CiAgICAgICAgbGwgc3VtID0gMDsKICAgICAgICBwb3cuYXNzaWduKG4rMSwgMCk7CiAgICAgICAgcG93WzBdID0gMTsKICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspewogICAgICAgICAgICBwb3dbaV0gPSAocG93W2ktMV0gKiBiYXNlKSAlIG1vZDsKICAgICAgICB9CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspewogICAgICAgICAgICBwcmVmaXhbaV0gPSAoKHN1bSAqIGJhc2UpICUgbW9kICsgc1tpXSAtICdhJykgJSBtb2Q7CiAgICAgICAgICAgIHN1bSA9IHByZWZpeFtpXTsKICAgICAgICB9CiAgICB9CiAgICBsbCBnZXRfaGFzaChsbCBsLCBsbCByKXsKICAgICAgICBsbCB4ID0gcHJlZml4W3JdOwogICAgICAgIGlmIChsID49IDEpewogICAgICAgICAgICBsLS07CiAgICAgICAgICAgIHggPSAoKHggLSBwcmVmaXhbbF0gKiBwb3dbciAtIGxdICUgbW9kKSAlIG1vZCArIG1vZCkgJSBtb2Q7CiAgICAgICAgfQogICAgICAgIHJldHVybiB4OwogICAgfQp9Owp2b2lkIHNvbHZlKCl7CiAgICBzdHJpbmcgczsKICAgIGNpbiA+PiBzOwogICAgbGwgbiA9IHMuc2l6ZSgpOwogICAgdmVjdG9yIDxsbD4gYW5zdzsKICAgIGhhc2hlZF9zdHJpbmcgdihzKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKXsKICAgICAgICBsbCBjdXIgPSB2LmdldF9oYXNoKDAsIGkpOwogICAgICAgIGxsIHN6ID0gaSArIDE7CiAgICAgICAgYm9vbCBmbGFnID0gdHJ1ZTsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiArIHN6IC0gMSA8IG47IGorPXN6KXsKICAgICAgICAgICAgaWYgKCEoY3VyID09IHYuZ2V0X2hhc2goaiwgaiArIHN6IC0gMSkpKXsKICAgICAgICAgICAgICAgIGZsYWcgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChuICUgc3ogPj0gMSl7CiAgICAgICAgICAgIGxsIGxlZnRfb3ZlciA9IG4gJSBzejsKICAgICAgICAgICAgZmxhZyA9IGZsYWcgJiYgKHYuZ2V0X2hhc2gobiAtIGxlZnRfb3Zlciwgbi0xKSA9PSB2LmdldF9oYXNoKDAsIGxlZnRfb3ZlciAtIDEpKTsKICAgICAgICB9CiAgICAgICAgaWYgKGZsYWcpIGFuc3cucHVzaF9iYWNrKHN6KTsKICAgIH0KICAgIGZvciAoYXV0byAmcCA6IGFuc3cpewogICAgICAgIGNvdXQgPDwgcCA8PCAiICI7CiAgICB9Cn0KaW50IG1haW4oKXsKICAgIGlvczo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUobnVsbHB0cik7CiAgICBzb2x2ZSgpOwogICAgcmV0dXJuIDA7Cn0=